From edc540afb10fc7039e61ec856af2b98d95bb3573 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 10 Sep 2007 20:46:27 +0000 Subject: [PATCH] - Enumerate time formats. - The user must able to change the locale id. Move it into a global structure. - User the selected locale id instead of LOCALE_USER_DEFAULT. svn path=/trunk/; revision=28996 --- reactos/dll/cpl/intl/currency.c | 2 +- reactos/dll/cpl/intl/date.c | 6 ++- reactos/dll/cpl/intl/generalp.c | 4 ++ reactos/dll/cpl/intl/intl.h | 5 ++ reactos/dll/cpl/intl/misc.c | 26 +++++++--- reactos/dll/cpl/intl/sort.c | 62 +++++++++++------------ reactos/dll/cpl/intl/time.c | 87 ++++++++++++++++++--------------- 7 files changed, 112 insertions(+), 80 deletions(-) diff --git a/reactos/dll/cpl/intl/currency.c b/reactos/dll/cpl/intl/currency.c index b433bf7f93d..5d1bbd8f8cd 100644 --- a/reactos/dll/cpl/intl/currency.c +++ b/reactos/dll/cpl/intl/currency.c @@ -301,7 +301,7 @@ OnInitDialog(HWND hwndDlg, PGLOBAL_DATA pGlobalData) static BOOL SetCurrencyDigNum(HWND hwndDlg) { - TCHAR szFieldDigNumSamples[MAX_FIELD_DIG_SAMPLES][MAX_SAMPLES_STR_SIZE]= + LPTSTR szFieldDigNumSamples[MAX_FIELD_DIG_SAMPLES]= { _T("0;0"), _T("3;0"), diff --git a/reactos/dll/cpl/intl/date.c b/reactos/dll/cpl/intl/date.c index fe4bbc60ba0..82953a411fb 100644 --- a/reactos/dll/cpl/intl/date.c +++ b/reactos/dll/cpl/intl/date.c @@ -540,11 +540,15 @@ DatePageProc(HWND hwndDlg, WPARAM wParam, LPARAM lParam) { + PGLOBALDATA pGlobalData; + switch (uMsg) { case WM_INITDIALOG: + pGlobalData = (PGLOBALDATA)((LPPROPSHEETPAGE)lParam)->lParam; + InitMinMaxDateSpin(hwndDlg); - UpdateDateLocaleSamples(hwndDlg, LOCALE_USER_DEFAULT); + UpdateDateLocaleSamples(hwndDlg, pGlobalData->lcid); InitShortDateCB(hwndDlg); InitLongDateCB(hwndDlg); InitShortDateSepSamples(hwndDlg); diff --git a/reactos/dll/cpl/intl/generalp.c b/reactos/dll/cpl/intl/generalp.c index 75476f11c53..80ab2553161 100644 --- a/reactos/dll/cpl/intl/generalp.c +++ b/reactos/dll/cpl/intl/generalp.c @@ -235,6 +235,7 @@ SetNewLocale(LCID lcid) } /* Location enumerate procedure */ +#if 0 BOOL CALLBACK LocationsEnumProc(GEOID gId) @@ -255,12 +256,14 @@ LocationsEnumProc(GEOID gId) return TRUE; } +#endif /* Enumerate all system locations identifiers */ static VOID CreateLocationsList(HWND hWnd) { +#if 0 GEOID userGeoID; TCHAR loc[MAX_STR_SIZE]; @@ -280,6 +283,7 @@ CreateLocationsList(HWND hWnd) CB_SELECTSTRING, (WPARAM) -1, (LPARAM)loc); +#endif } DWORD diff --git a/reactos/dll/cpl/intl/intl.h b/reactos/dll/cpl/intl/intl.h index 293b6fed410..d9741b16a3b 100644 --- a/reactos/dll/cpl/intl/intl.h +++ b/reactos/dll/cpl/intl/intl.h @@ -14,6 +14,11 @@ typedef struct _APPLET APPLET_PROC AppletProc; } APPLET, *PAPPLET; +typedef struct _GLOBALDATA +{ + LCID lcid; +} GLOBALDATA, *PGLOBALDATA; + extern HINSTANCE hApplet; extern DWORD IsUnattendedSetupEnabled; extern DWORD UnattendLCID; diff --git a/reactos/dll/cpl/intl/misc.c b/reactos/dll/cpl/intl/misc.c index 8cfa9a28fb3..188be284d50 100644 --- a/reactos/dll/cpl/intl/misc.c +++ b/reactos/dll/cpl/intl/misc.c @@ -175,7 +175,7 @@ ReplaceSubStr(LPCTSTR szSourceStr, static VOID -InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc, LCID lcid) +InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc, PGLOBALDATA pGlobalData) { ZeroMemory(psp, sizeof(PROPSHEETPAGE)); psp->dwSize = sizeof(PROPSHEETPAGE); @@ -183,7 +183,7 @@ InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc, LCID lcid) psp->hInstance = hApplet; psp->pszTemplate = MAKEINTRESOURCE(idDlg); psp->pfnDlgProc = DlgProc; - psp->lParam = (LPARAM)lcid; + psp->lParam = (LPARAM)pGlobalData; } @@ -194,10 +194,16 @@ SetupApplet(LCID lcid) { PROPSHEETPAGE PsPage[NUM_SHEETS + 1]; PROPSHEETHEADER psh; + PGLOBALDATA pGlobalData; TCHAR Caption[MAX_STR_SIZE]; + INT ret; LoadString(hApplet, IDS_CUSTOMIZE_TITLE, Caption, sizeof(Caption) / sizeof(TCHAR)); + pGlobalData = (PGLOBALDATA)malloc(sizeof(GLOBALDATA)); + + pGlobalData->lcid = lcid; + ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); psh.dwSize = sizeof(PROPSHEETHEADER); psh.dwFlags = PSH_PROPSHEETPAGE | PSH_USECALLBACK | PSH_PROPTITLE; @@ -209,18 +215,22 @@ SetupApplet(LCID lcid) psh.nStartPage = 0; psh.ppsp = PsPage; - InitPropSheetPage(&PsPage[0], IDD_NUMBERSPAGE, NumbersPageProc, lcid); - InitPropSheetPage(&PsPage[1], IDD_CURRENCYPAGE, CurrencyPageProc, lcid); - InitPropSheetPage(&PsPage[2], IDD_TIMEPAGE, TimePageProc, lcid); - InitPropSheetPage(&PsPage[3], IDD_DATEPAGE, DatePageProc, lcid); + InitPropSheetPage(&PsPage[0], IDD_NUMBERSPAGE, NumbersPageProc, pGlobalData); + InitPropSheetPage(&PsPage[1], IDD_CURRENCYPAGE, CurrencyPageProc, pGlobalData); + InitPropSheetPage(&PsPage[2], IDD_TIMEPAGE, TimePageProc, pGlobalData); + InitPropSheetPage(&PsPage[3], IDD_DATEPAGE, DatePageProc, pGlobalData); if (IsSortPageNeeded(lcid)) { psh.nPages++; - InitPropSheetPage(&PsPage[4], IDD_SORTPAGE, SortPageProc, lcid); + InitPropSheetPage(&PsPage[4], IDD_SORTPAGE, SortPageProc, pGlobalData); } - return (LONG)(PropertySheet(&psh) != -1); + ret = PropertySheet(&psh); + + free(pGlobalData); + + return (LONG)(ret != -1); } /* EOF */ diff --git a/reactos/dll/cpl/intl/sort.c b/reactos/dll/cpl/intl/sort.c index c5ab621c3e5..8a0c5a06c99 100644 --- a/reactos/dll/cpl/intl/sort.c +++ b/reactos/dll/cpl/intl/sort.c @@ -156,14 +156,17 @@ SortPageProc(HWND hwndDlg, WPARAM wParam, LPARAM lParam) { + PGLOBALDATA pGlobalData; + + pGlobalData = (PGLOBALDATA)GetWindowLongPtr(hwndDlg, DWLP_USER); + switch (uMsg) { case WM_INITDIALOG: - { - LCID lcid = (LCID)((LPPROPSHEETPAGE)lParam)->lParam; + pGlobalData = (PGLOBALDATA)((LPPROPSHEETPAGE)lParam)->lParam; + SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData); - CreateSortList(GetDlgItem(hwndDlg, IDC_SORTLIST_COMBO), lcid); - } + CreateSortList(GetDlgItem(hwndDlg, IDC_SORTLIST_COMBO), pGlobalData->lcid); break; case WM_COMMAND: @@ -172,6 +175,28 @@ SortPageProc(HWND hwndDlg, case IDC_SORTLIST_COMBO: if (HIWORD(wParam) == CBN_SELCHANGE) { + LCID NewLcid; + INT iCurSel; + + iCurSel = SendDlgItemMessage(hwndDlg, + IDC_SORTLIST_COMBO, + CB_GETCURSEL, + 0, + 0); + if (iCurSel == CB_ERR) + break; + + NewLcid = SendDlgItemMessage(hwndDlg, + IDC_SORTLIST_COMBO, + CB_GETITEMDATA, + iCurSel, + 0); + if (NewLcid == (LCID)CB_ERR) + break; + + /* Save the new LCID */ + pGlobalData->lcid = NewLcid; + PropSheet_Changed(GetParent(hwndDlg), hwndDlg); } break; @@ -179,34 +204,9 @@ SortPageProc(HWND hwndDlg, break; case WM_NOTIFY: + if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY) { - LPNMHDR lpnm = (LPNMHDR)lParam; - - if (lpnm->code == (UINT)PSN_APPLY) - { - - LCID NewLcid; - INT iCurSel; - - iCurSel = SendDlgItemMessage(hwndDlg, - IDC_SORTLIST_COMBO, - CB_GETCURSEL, - 0, - 0); - if (iCurSel == CB_ERR) - break; - - NewLcid = SendDlgItemMessage(hwndDlg, - IDC_SORTLIST_COMBO, - CB_GETITEMDATA, - iCurSel, - 0); - if (NewLcid == (LCID)CB_ERR) - break; -#if 0 - /* FIXME: Set locale ID */ -#endif - } + /* FIXME: Set locale ID: pGlobalData->lcid */ } break; } diff --git a/reactos/dll/cpl/intl/time.c b/reactos/dll/cpl/intl/time.c index b1d29a44cd0..7b234bcd269 100644 --- a/reactos/dll/cpl/intl/time.c +++ b/reactos/dll/cpl/intl/time.c @@ -31,22 +31,26 @@ #include "intl.h" #include "resource.h" -/* - * TODO: - * - Enumerate available time formats (use EnumTimeFormats) - */ +static HWND hwndEnum = NULL; + +static BOOL CALLBACK +TimeFormatEnumProc(LPTSTR lpTimeFormatString) +{ + SendMessage(hwndEnum, + CB_ADDSTRING, + 0, + (LPARAM)lpTimeFormatString); + + return TRUE; +} static VOID -UpdateTimeSample(HWND hWnd) +UpdateTimeSample(HWND hWnd, LCID lcid) { - TCHAR InBuffer[80]; - TCHAR OutBuffer[80]; + TCHAR szBuffer[80]; - GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STIMEFORMAT, InBuffer, 80); - - GetTimeFormat(LOCALE_USER_DEFAULT, 0, NULL, InBuffer, OutBuffer, 80); - - SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM)OutBuffer); + GetTimeFormat(lcid, 0, NULL, NULL, szBuffer, 80); + SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM)szBuffer); } @@ -57,36 +61,41 @@ TimePageProc(HWND hwndDlg, WPARAM wParam, LPARAM lParam) { - switch (uMsg) - { - case WM_INITDIALOG: - { - TCHAR Buffer[80]; - int nLen; + PGLOBALDATA pGlobalData; + + pGlobalData = (PGLOBALDATA)GetWindowLongPtr(hwndDlg, DWLP_USER); + + switch (uMsg) + { + case WM_INITDIALOG: + { + TCHAR Buffer[80]; + int nLen; + + pGlobalData = (PGLOBALDATA)((LPPROPSHEETPAGE)lParam)->lParam; + SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData); /* Update the time format sample */ - UpdateTimeSample(GetDlgItem(hwndDlg, IDC_TIMESAMPLE)); + UpdateTimeSample(GetDlgItem(hwndDlg, IDC_TIMESAMPLE), pGlobalData->lcid); /* Get the time format (max. 80 characters) */ SendMessage(GetDlgItem(hwndDlg, IDC_TIMEFORMAT), CB_LIMITTEXT, 80, 0); - /* FIXME: add available time formats to the list */ + /* Add available time formats to the list */ + hwndEnum = GetDlgItem(hwndDlg, IDC_TIMEFORMAT); + EnumTimeFormats(TimeFormatEnumProc, pGlobalData->lcid, 0); - GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STIMEFORMAT, Buffer, 80); + GetLocaleInfo(pGlobalData->lcid, LOCALE_STIMEFORMAT, Buffer, 80); SendMessage(GetDlgItem(hwndDlg, IDC_TIMEFORMAT), - CB_ADDSTRING, - 0, + CB_SELECTSTRING, + -1, (LPARAM)Buffer); - SendMessage(GetDlgItem(hwndDlg, IDC_TIMEFORMAT), - CB_SETCURSEL, - 0, /* index */ - 0); /* Get the time separator (max. 4 characters) */ SendMessage(GetDlgItem(hwndDlg, IDC_TIMESEPARATOR), CB_LIMITTEXT, 4, 0); - GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STIME, Buffer, 80); + GetLocaleInfo(pGlobalData->lcid, LOCALE_STIME, Buffer, 80); SendMessage(GetDlgItem(hwndDlg, IDC_TIMESEPARATOR), CB_ADDSTRING, 0, @@ -99,7 +108,7 @@ TimePageProc(HWND hwndDlg, /* Get the AM symbol (max. 9 characters) */ SendMessage(GetDlgItem(hwndDlg, IDC_TIMEAMSYMBOL), CB_LIMITTEXT, 9, 0); - nLen = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_S1159, Buffer, 80); + nLen = GetLocaleInfo(pGlobalData->lcid, LOCALE_S1159, Buffer, 80); SendMessage(GetDlgItem(hwndDlg, IDC_TIMEAMSYMBOL), CB_ADDSTRING, 0, @@ -119,7 +128,7 @@ TimePageProc(HWND hwndDlg, /* Get the PM symbol (max. 9 characters) */ SendMessage(GetDlgItem(hwndDlg, IDC_TIMEPMSYMBOL), CB_LIMITTEXT, 9, 0); - nLen = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_S2359, Buffer, 80); + nLen = GetLocaleInfo(pGlobalData->lcid, LOCALE_S2359, Buffer, 80); SendMessage(GetDlgItem(hwndDlg, IDC_TIMEPMSYMBOL), CB_ADDSTRING, 0, @@ -168,14 +177,14 @@ TimePageProc(HWND hwndDlg, CB_GETCURSEL, 0, 0); SendMessage(GetDlgItem(hwndDlg, IDC_TIMEFORMAT), CB_GETLBTEXT, (WPARAM)nIndex, (LPARAM)Buffer); - SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STIMEFORMAT, Buffer); + SetLocaleInfo(pGlobalData->lcid, LOCALE_STIMEFORMAT, Buffer); /* Set time separator */ nIndex = SendMessage(GetDlgItem(hwndDlg, IDC_TIMESEPARATOR), CB_GETCURSEL, 0, 0); SendMessage(GetDlgItem(hwndDlg, IDC_TIMESEPARATOR), CB_GETLBTEXT, (WPARAM)nIndex, (LPARAM)Buffer); - SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STIME, Buffer); + SetLocaleInfo(pGlobalData->lcid, LOCALE_STIME, Buffer); /* Set the AM symbol */ nIndex = SendMessage(GetDlgItem(hwndDlg, IDC_TIMEAMSYMBOL), @@ -184,11 +193,11 @@ TimePageProc(HWND hwndDlg, { SendMessage(GetDlgItem(hwndDlg, IDC_TIMEAMSYMBOL), CB_GETLBTEXT, (WPARAM)nIndex, (LPARAM)Buffer); - SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_S1159, Buffer); + SetLocaleInfo(pGlobalData->lcid, LOCALE_S1159, Buffer); } else { - SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_S1159, _T("")); + SetLocaleInfo(pGlobalData->lcid, LOCALE_S1159, _T("")); } /* Set the PM symbol */ @@ -198,21 +207,21 @@ TimePageProc(HWND hwndDlg, { SendMessage(GetDlgItem(hwndDlg, IDC_TIMEPMSYMBOL), CB_GETLBTEXT, (WPARAM)nIndex, (LPARAM)Buffer); - SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_S2359, Buffer); + SetLocaleInfo(pGlobalData->lcid, LOCALE_S2359, Buffer); } else { - SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_S2359, _T("")); + SetLocaleInfo(pGlobalData->lcid, LOCALE_S2359, _T("")); } /* Update the time format sample */ - UpdateTimeSample(GetDlgItem(hwndDlg, IDC_TIMESAMPLE)); + UpdateTimeSample(GetDlgItem(hwndDlg, IDC_TIMESAMPLE), pGlobalData->lcid); } } break; - } + } - return FALSE; + return FALSE; } /* EOF */