From f2f67e344cc68bec99bb42ce97b4ba462c6aa73e Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Mon, 19 Jun 2006 12:43:29 +0000 Subject: [PATCH] Alexey Zavyalov: Start implementing new International Settings applet (Windows XP-alike style, and eventually will work in Windows XP). I keep the old intl.cpl in our tree since it contains some hacks to switch languages/locales/layouts, which will soon be gone (along with the old intl.cpl logically) svn path=/trunk/; revision=22412 --- reactos/dll/cpl/cpl.rbuild | 3 + reactos/dll/cpl/intl_new/En.rc | 48 +++ reactos/dll/cpl/intl_new/extra.c | 102 ++++++ reactos/dll/cpl/intl_new/intl.c | 138 ++++++++ reactos/dll/cpl/intl_new/intl.def | 8 + reactos/dll/cpl/intl_new/intl.h | 31 ++ reactos/dll/cpl/intl_new/intl.rbuild | 18 ++ reactos/dll/cpl/intl_new/intl.rc | 20 ++ reactos/dll/cpl/intl_new/locale.c | 301 ++++++++++++++++++ reactos/dll/cpl/intl_new/resource.h | 38 +++ reactos/dll/cpl/intl_new/resources/applet.ico | Bin 0 -> 17542 bytes reactos/dll/cpl/intl_new/resources/flags.ico | Bin 0 -> 25214 bytes 12 files changed, 707 insertions(+) create mode 100644 reactos/dll/cpl/intl_new/En.rc create mode 100644 reactos/dll/cpl/intl_new/extra.c create mode 100644 reactos/dll/cpl/intl_new/intl.c create mode 100644 reactos/dll/cpl/intl_new/intl.def create mode 100644 reactos/dll/cpl/intl_new/intl.h create mode 100644 reactos/dll/cpl/intl_new/intl.rbuild create mode 100644 reactos/dll/cpl/intl_new/intl.rc create mode 100644 reactos/dll/cpl/intl_new/locale.c create mode 100644 reactos/dll/cpl/intl_new/resource.h create mode 100644 reactos/dll/cpl/intl_new/resources/applet.ico create mode 100644 reactos/dll/cpl/intl_new/resources/flags.ico diff --git a/reactos/dll/cpl/cpl.rbuild b/reactos/dll/cpl/cpl.rbuild index 02b5861ba37..a02e9c6a5ab 100644 --- a/reactos/dll/cpl/cpl.rbuild +++ b/reactos/dll/cpl/cpl.rbuild @@ -13,6 +13,9 @@ + + + diff --git a/reactos/dll/cpl/intl_new/En.rc b/reactos/dll/cpl/intl_new/En.rc new file mode 100644 index 00000000000..ead119f7fde --- /dev/null +++ b/reactos/dll/cpl/intl_new/En.rc @@ -0,0 +1,48 @@ +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +IDD_REGOPTSPAGE DIALOGEX 0, 0, 252, 236 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Regional options" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Regional options and standards", IDC_GROUPBOX, 5, 3, 242, 165 + LTEXT "This option influences a way of display by some programs of numbers, sums of money, dates and time.", IDC_STATIC, 14, 15, 230, 16 + LTEXT "&Choose an element from the list or press the button ""Setup"" to set formats independently:", IDC_STATIC, 14, 36, 230, 16 + COMBOBOX IDC_SETREG_COMBO, 14, 54, 168, 120, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | + WS_VSCROLL | WS_TABSTOP | CBS_SORT + PUSHBUTTON "Se&tup...", IDC_SETUP_BUTTON, 187, 54, 52, 13 + LTEXT "Samples", IDC_STATIC, 14, 73, 70, 10 + LTEXT "Number:", IDC_STATIC, 16, 86, 48, 10 + LTEXT "Monetary:", IDC_STATIC, 16, 101, 48, 10 + LTEXT "Time:", IDC_STATIC, 16, 116, 48, 10 + LTEXT "Short date:", IDC_STATIC, 16, 131, 48, 10 + LTEXT "Long date:", IDC_STATIC, 16, 146, 48, 10 + EDITTEXT IDC_NUMSAMPLE_EDIT, 69, 86, 170, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP + EDITTEXT IDC_MONEYSAMPLE_EDIT, 69, 101, 170, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP + EDITTEXT IDC_TIMESAMPLE_EDIT, 69, 116, 170, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP + EDITTEXT IDC_SHORTTIMESAMPLE_EDIT, 69, 131, 170, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP + EDITTEXT IDC_FULLTIMESAMPLE_EDIT, 69, 146, 170, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP + GROUPBOX "Geographic location", IDC_GROUPBOX, 5, 172, 242, 56 + LTEXT "Set up your location that services could supply you with the local information, for example, news and reports of weather", IDC_STATIC, 14, 184, 225, 24 + COMBOBOX IDC_LOCATION_COMBO, 14, 211, 225, 40, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | + WS_VSCROLL | WS_TABSTOP | CBS_SORT +END + +IDD_EXTRAOPTSPAGE DIALOGEX 0, 0, 252, 236 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Extra" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Program language that not unicode supported", IDC_GROUPBOX, 5, 5, 242, 90 + COMBOBOX IDC_LANGUAGE_COMBO, 14, 75, 225, 60, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | + WS_VSCROLL | WS_TABSTOP | CBS_SORT + LTEXT "This option...", IDC_STATIC, 14, 18, 223, 33 + LTEXT "Select language...", IDC_STATIC, 14, 55, 223, 18 + GROUPBOX "Transformation tables codepages", IDC_GROUPBOX, 5, 101, 242, 88 +END + +STRINGTABLE +BEGIN + IDS_CPLNAME "Language and regional options" + IDS_CPLDESCRIPTION "Choose language and formats of numbers, currencies, time and date" +END diff --git a/reactos/dll/cpl/intl_new/extra.c b/reactos/dll/cpl/intl_new/extra.c new file mode 100644 index 00000000000..20dc3c888db --- /dev/null +++ b/reactos/dll/cpl/intl_new/extra.c @@ -0,0 +1,102 @@ +/* + * PROJECT: ReactOS International Control Panel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: lib/cpl/intl/extra.c + * PURPOSE: Extra parameters page + * PROGRAMMERS: Alexey Zavyalov (gen_x@mail.ru) +*/ + +/* INCLUDES *****************************************************************/ + +#include +#include +#include + +#include "intl.h" +#include "resource.h" + +/* GLOBALS ******************************************************************/ + +HWND hLanguageList; + +/* FUNCTIONS ****************************************************************/ + +/* Language enumerate procedure */ +BOOL +CALLBACK +LanguagesEnumProc(LPTSTR lpLanguage) +{ + LCID Lcid; + TCHAR Lang[MAX_STR_SIZE]; + int Index; + + Lcid = wcstoul(lpLanguage, NULL, 16); + + GetLocaleInfo(Lcid, LOCALE_SLANGUAGE, Lang, sizeof(Lang)); + Index = SendMessageW(hLanguageList, + CB_ADDSTRING, + 0, + (LPARAM)Lang); + + SendMessageW(hLanguageList, + CB_SETITEMDATA, + Index, + (LPARAM)Lcid); + + return TRUE; +} + +/* Enumerate all installed language identifiers */ +static +VOID +CreateLanguagesList(HWND hWnd) +{ + TCHAR LangSel[MAX_STR_SIZE]; + + hLanguageList = hWnd; + + EnumSystemLocalesW(LanguagesEnumProc, LCID_INSTALLED); + + // Select current locale + GetLocaleInfo(GetUserDefaultLCID(), + LOCALE_SLANGUAGE, + LangSel, + sizeof(LangSel)); + + SendMessageW(hLanguageList, + CB_SELECTSTRING, + -1, + (LPARAM)LangSel); +} + + +/* Extra Parameters page dialog callback */ +INT_PTR +CALLBACK +ExtraOptsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG: + CreateLanguagesList(GetDlgItem(hwndDlg, IDC_LANGUAGE_COMBO)); + break; + + case WM_COMMAND: + + break; + + case WM_NOTIFY: + { + LPNMHDR Lpnm = (LPNMHDR)lParam; + /* If push apply button */ + if (Lpnm->code == (UINT)PSN_APPLY) + { + // TODO: Implement + } + } + break; + } + return FALSE; +} + +/* EOF */ diff --git a/reactos/dll/cpl/intl_new/intl.c b/reactos/dll/cpl/intl_new/intl.c new file mode 100644 index 00000000000..8ef0b3b6424 --- /dev/null +++ b/reactos/dll/cpl/intl_new/intl.c @@ -0,0 +1,138 @@ +/* + * PROJECT: ReactOS International Control Panel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: lib/cpl/intl/intl.c + * PURPOSE: ReactOS International Control Panel + * PROGRAMMERS: Eric Kohl + * Alexey Zavyalov (gen_x@mail.ru) +*/ + +/* INCLUDES *****************************************************************/ + +#include +#include +#include + +#include "resource.h" +#include "intl.h" + +/* GLOBALS ******************************************************************/ + +#define NUM_APPLETS (1) +#define NUM_SHEETS 2 + +LONG APIENTRY Applet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam); + +HINSTANCE hApplet; + +APPLET Applets[NUM_APPLETS] = +{ + {IDC_CPLICON, IDS_CPLNAME, IDS_CPLDESCRIPTION, Applet} +}; + +/* FUNCTIONS ****************************************************************/ + +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 +Applet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam) +{ + + PROPSHEETPAGE PsPage[NUM_SHEETS]; + PROPSHEETHEADER psh; + TCHAR Caption[MAX_STR_SIZE]; + + 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_REGOPTSPAGE, RegOptsProc); + InitPropSheetPage(&PsPage[1], IDD_EXTRAOPTSPAGE, ExtraOptsProc); + + return (LONG)(PropertySheet(&psh) != -1); +} + +/* Control Panel Callback */ +LONG +CALLBACK +CPlApplet(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2) +{ + switch(uMsg) + { + case CPL_INIT: + { + return TRUE; + } + case CPL_GETCOUNT: + { + return NUM_APPLETS; + } + case CPL_INQUIRE: + { + CPLINFO *CplInfo = (CPLINFO*)lParam2; + UINT uAppIndex = (UINT)lParam1; + + CplInfo->lData = 0; + CplInfo->idIcon = Applets[uAppIndex].idIcon; + CplInfo->idName = Applets[uAppIndex].idName; + CplInfo->idInfo = Applets[uAppIndex].idDescription; + break; + } + case CPL_DBLCLK: + { + UINT uAppIndex = (UINT)lParam1; + Applets[uAppIndex].AppletProc(hwndCPl, uMsg, lParam1, lParam2); + break; + } + } + + return FALSE; +} + +/* Standart DLL entry */ + +BOOL +STDCALL +DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved) +{ + INITCOMMONCONTROLSEX InitControls; + switch(dwReason) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + { + InitControls.dwSize = sizeof(INITCOMMONCONTROLSEX); + InitControls.dwICC = ICC_LISTVIEW_CLASSES | ICC_UPDOWN_CLASS | ICC_BAR_CLASSES; + InitCommonControlsEx(&InitControls); + + hApplet = hinstDLL; + break; + } + } + + + return TRUE; +} + +/* EOF */ diff --git a/reactos/dll/cpl/intl_new/intl.def b/reactos/dll/cpl/intl_new/intl.def new file mode 100644 index 00000000000..ca8e1e4e3fd --- /dev/null +++ b/reactos/dll/cpl/intl_new/intl.def @@ -0,0 +1,8 @@ +LIBRARY intl.cpl + +EXPORTS +CPlApplet@16 +RegOptsProc@16 +ExtraOptsProc@16 + +; EOF diff --git a/reactos/dll/cpl/intl_new/intl.h b/reactos/dll/cpl/intl_new/intl.h new file mode 100644 index 00000000000..be9f486aebe --- /dev/null +++ b/reactos/dll/cpl/intl_new/intl.h @@ -0,0 +1,31 @@ +#ifndef __INTL_H +#define __INTL_H + +/* GLOBALS ******************************************************************/ + +#define MAX_STR_SIZE 128 +#define MAX_FMT_SIZE 30 + +typedef struct +{ + int idIcon; + int idName; + int idDescription; + APPLET_PROC AppletProc; +} APPLET, *PAPPLET; + +extern HINSTANCE hApplet; + +/* locale.c */ +INT_PTR +CALLBACK +RegOptsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); + +/* extra.c */ +INT_PTR +CALLBACK +ExtraOptsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); + +#endif /* __INTL_H */ + +/* EOF */ diff --git a/reactos/dll/cpl/intl_new/intl.rbuild b/reactos/dll/cpl/intl_new/intl.rbuild new file mode 100644 index 00000000000..536afb17821 --- /dev/null +++ b/reactos/dll/cpl/intl_new/intl.rbuild @@ -0,0 +1,18 @@ + + + . + + + + + 0x600 + 0x501 + kernel32 + user32 + comctl32 + advapi32 + intl.c + locale.c + extra.c + intl.rc + diff --git a/reactos/dll/cpl/intl_new/intl.rc b/reactos/dll/cpl/intl_new/intl.rc new file mode 100644 index 00000000000..83d450c181c --- /dev/null +++ b/reactos/dll/cpl/intl_new/intl.rc @@ -0,0 +1,20 @@ +#include +#include "resource.h" + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Control Panel\0" +#define REACTOS_STR_INTERNAL_NAME "intl\0" +#define REACTOS_STR_ORIGINAL_FILENAME "intl.cpl\0" +#include + +IDC_CPLICON ICON "resources/applet.ico" +IDC_FLAGS ICON "resources/flags.ico" + + +/* + * Everything specific to any language goes in one of the specific + * files. Note that you can and may override resources which also have + * a neutral version. This is to get localized bitmaps for example. +*/ + +#include "En.rc" diff --git a/reactos/dll/cpl/intl_new/locale.c b/reactos/dll/cpl/intl_new/locale.c new file mode 100644 index 00000000000..b24d9c8a27c --- /dev/null +++ b/reactos/dll/cpl/intl_new/locale.c @@ -0,0 +1,301 @@ +/* + * PROJECT: ReactOS International Control Panel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: lib/cpl/intl/locale.h + * PURPOSE: Regional parameters page + * PROGRAMMERS: Eric Kohl + * Alexey Zavyalov (gen_x@mail.ru) +*/ + +/* INCLUDES *****************************************************************/ + +#include +#include +#include + +#include "intl.h" +#include "resource.h" + +/* GLOBALS ******************************************************************/ + +#define SAMPLE_NUMBER L"123456789" +#define NO_FLAG 0 + +HWND hLocaleList, hGeoList; + +/* FUNCTIONS ****************************************************************/ + +/* 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 = 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, + -1, + (LPARAM)loc); +} + +/* Locale enumerate procedure */ +BOOL +CALLBACK +LocalesEnumProc(LPTSTR lpLocale) +{ + LCID lcid; + TCHAR lang[MAX_STR_SIZE]; + int index; + + lcid = wcstoul(lpLocale, NULL, 16); + + GetLocaleInfo(lcid, LOCALE_SLANGUAGE, lang, sizeof(lang)); + index = SendMessageW(hLocaleList, + CB_ADDSTRING, + 0, + (LPARAM)lang); + + SendMessageW(hLocaleList, + CB_SETITEMDATA, + index, + (LPARAM)lcid); + + return TRUE; +} + +/* Enumerate all installed locale identifiers */ +static +VOID +CreateLanguagesList(HWND hWnd) +{ + TCHAR langSel[MAX_STR_SIZE]; + + hLocaleList = hWnd; + + EnumSystemLocalesW(LocalesEnumProc, LCID_INSTALLED); + + // Select current locale + GetLocaleInfo(GetUserDefaultLCID(), + LOCALE_SLANGUAGE, + langSel, + sizeof(langSel)); + + SendMessageW(hLocaleList, + CB_SELECTSTRING, + -1, + (LPARAM)langSel); +} + + +/* 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); +} + +/* Setting up new locale */ +static +VOID +SetNewLocale(LCID LcidLocale) +{ + int RetCode; + TCHAR OutBuff[MAX_STR_SIZE]; + int LocaleCounter; + HKEY LocaleKey; + TCHAR Value[9]; + DWORD ValueSize; + + //SetUserDefaultLCID(LcidLocale); // Not implemented in MS :( + + if(!IsValidLocale(LcidLocale, LCID_INSTALLED)) + { + MessageBoxW(NULL, L"Invalid locale.", L"Critical error", + MB_OK | MB_ICONERROR); + return; + } + + //HACKHACK: I'm sure there is a better way to do this + for(LocaleCounter = LOCALE_ILANGUAGE; + LocaleCounter <= LOCALE_SISO3166CTRYNAME; LocaleCounter++) + { + RetCode = GetLocaleInfoW(LcidLocale, + (LCTYPE)LocaleCounter, + OutBuff, + sizeof(OutBuff)); + if(RetCode == ERROR_INVALID_PARAMETER) + continue; + SetLocaleInfoW(LOCALE_USER_DEFAULT, (LCTYPE)LocaleCounter, OutBuff); + } + + RetCode = RegOpenKeyW(HKEY_CURRENT_USER, + L"Control Panel\\International", + &LocaleKey); + + if(RetCode != ERROR_SUCCESS) + { + MessageBoxW(NULL, + L"Problem opening HKCU\\Control Panel\\International key", + L"Critical error", MB_OK | MB_ICONERROR); + return; + } + + wsprintf(Value, L"%04X", (DWORD)LcidLocale); + ValueSize = (wcslen(Value) + 1) * sizeof(WCHAR); + + RegSetValueExW(LocaleKey, L"Locale", 0, REG_SZ, (BYTE *)Value, ValueSize); + RegCloseKey(LocaleKey); +} + +/* Regional Parameters page dialog callback */ +INT_PTR +CALLBACK +RegOptsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + int CurrSel; + LCID NewLCID; + GEOID NewLocation; + + switch(uMsg) + { + case WM_INITDIALOG: + CreateLocationsList(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO)); + CreateLanguagesList(GetDlgItem(hwndDlg, IDC_SETREG_COMBO)); + /* Update locale samples */ + UpdateLocaleSample(hwndDlg, LOCALE_USER_DEFAULT); + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDC_SETUP_BUTTON: + // setup button code... + MessageBox(NULL, L"Not implemented yet", L"Info", + MB_OK | MB_ICONINFORMATION); + break; + + /* If selected other locale */ + case IDC_SETREG_COMBO: + if (HIWORD(wParam) == CBN_SELCHANGE || + HIWORD(wParam) == CBN_EDITCHANGE) + { + CurrSel = SendMessageW((HWND)lParam, CB_GETCURSEL, + 0, 0); + NewLCID = SendMessageW((HWND)lParam, CB_GETITEMDATA, + CurrSel, 0); + UpdateLocaleSample(hwndDlg, + MAKELCID(NewLCID, SORT_DEFAULT)); + PropSheet_Changed(GetParent(hwndDlg), hwndDlg); + } + break; + + case IDC_LOCATION_COMBO: + if (HIWORD(wParam) == CBN_SELCHANGE || + HIWORD(wParam) == CBN_EDITCHANGE) + { + PropSheet_Changed(GetParent(hwndDlg), hwndDlg); + } + break; + } + break; + + case WM_NOTIFY: + { + LPNMHDR lpnm = (LPNMHDR)lParam; + /* If push apply button */ + if (lpnm->code == (UINT)PSN_APPLY) + { + /* Set locale */ + CurrSel = SendMessageW(GetDlgItem(hwndDlg, IDC_SETREG_COMBO), + CB_GETCURSEL, 0, 0); + NewLCID = SendMessageW(GetDlgItem(hwndDlg, IDC_SETREG_COMBO), + CB_GETITEMDATA, CurrSel, 0); + if (NewLCID == (LCID)CB_ERR) break; + + SetNewLocale(MAKELCID(NewLCID, SORT_DEFAULT)); + + /* Set geo location */ + CurrSel = SendMessageW(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO), + CB_GETCURSEL, + 0, + 0); + NewLocation = SendMessageW(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO), + CB_GETITEMDATA, + CurrSel, + 0); + SetUserGeoID(NewLocation); + } + } + break; + } + return FALSE; +} + +/* EOF */ diff --git a/reactos/dll/cpl/intl_new/resource.h b/reactos/dll/cpl/intl_new/resource.h new file mode 100644 index 00000000000..699f11758ed --- /dev/null +++ b/reactos/dll/cpl/intl_new/resource.h @@ -0,0 +1,38 @@ +#ifndef __CPL_RESOURCE_H +#define __CPL_RESOURCE_H + +/* CPL file info */ +#define IDC_CPLICON 1 +#define IDC_FLAGS 2 +#define IDC_ICON1 3 + +#define IDS_CPLNAME 10 +#define IDS_CPLDESCRIPTION 11 + +/* Region page options */ +#define IDD_REGOPTSPAGE 100 + +#define IDC_GROUPBOX 101 +#define IDC_STATIC 102 +#define IDC_SETREG_COMBO 103 +#define IDC_SETUP_BUTTON 104 +#define IDC_NUMSAMPLE_EDIT 105 +#define IDC_MONEYSAMPLE_EDIT 106 +#define IDC_TIMESAMPLE_EDIT 107 +#define IDC_SHORTTIMESAMPLE_EDIT 108 +#define IDC_FULLTIMESAMPLE_EDIT 109 +#define IDC_LOCATION_COMBO 110 + +/* Extra page options */ + +#define IDD_EXTRAOPTSPAGE 200 + +#define IDC_LANGUAGE_COMBO 103 + +/* Other page options */ + +// ... something + +#endif /* __CPL_RESOURCE_H */ + +/* EOF */ diff --git a/reactos/dll/cpl/intl_new/resources/applet.ico b/reactos/dll/cpl/intl_new/resources/applet.ico new file mode 100644 index 0000000000000000000000000000000000000000..d668a0db539fae9b61243d802313436f2ff98a2e GIT binary patch literal 17542 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 literal 0 HcmV?d00001 diff --git a/reactos/dll/cpl/intl_new/resources/flags.ico b/reactos/dll/cpl/intl_new/resources/flags.ico new file mode 100644 index 0000000000000000000000000000000000000000..750f2d0c522eaa1b4ef091dfa7b09bfe61fc99e6 GIT binary patch literal 25214 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