- Fill combo box with languages and keyboard layouts.

- Store data in structure for preselection of values.
- TODO: preselect keyboard layout after language selection / default language

svn path=/trunk/; revision=35113
This commit is contained in:
Matthias Kupfer 2008-08-04 20:40:34 +00:00
parent 1138fdcb70
commit 7da2062490

View file

@ -26,6 +26,7 @@
*/ */
#include <windows.h> #include <windows.h>
#include <windowsx.h>
#include <commctrl.h> #include <commctrl.h>
#include <tchar.h> #include <tchar.h>
#include <setupapi.h> #include <setupapi.h>
@ -37,19 +38,40 @@
HFONT hTitleFont; HFONT hTitleFont;
typedef struct _LANG
{
TCHAR LangId[9];
TCHAR LangName[128];
LONG DefaultKBLayout;
} LANG, *PLANG;
typedef struct _KBLAYOUT
{
TCHAR LayoutId[9];
TCHAR LayoutName[128];
TCHAR DllName[128];
} KBLAYOUT, *PKBLAYOUT;
struct struct
{ {
// Settings
LONG DestDiskNumber; // physical disk LONG DestDiskNumber; // physical disk
LONG DestPartNumber; // partition on disk LONG DestPartNumber; // partition on disk
LONG DestPartSize; // if partition doesn't exist, size of partition LONG DestPartSize; // if partition doesn't exist, size of partition
LONG FSType; // file system type on partition LONG FSType; // file system type on partition
LONG MBRInstallType; // install bootloader LONG MBRInstallType; // install bootloader
LONG FormatPart; // type of format the partition LONG FormatPart; // type of format the partition
WCHAR SelectedLangId[4]; // selected language TCHAR SelectedLangId[9]; // selected language
TCHAR SelectedKBLayout[9]; // selected kayboard layout
WCHAR InstallationDirectory[MAX_PATH]; // installation directory on hdd WCHAR InstallationDirectory[MAX_PATH]; // installation directory on hdd
WCHAR DefaultLang[20]; // default language
WCHAR DefaultKBLayout[20]; // default keyboard layout
BOOLEAN RepairUpdateFlag; // flag for update/repair an installed reactos BOOLEAN RepairUpdateFlag; // flag for update/repair an installed reactos
// txtsetup.sif data
TCHAR DefaultLang[20]; // default language
TCHAR DefaultKBLayout[20]; // default keyboard layout
PLANG pLanguages;
LONG LangCount;
PKBLAYOUT pKbLayouts;
LONG KbLayoutCount;
} SetupData; } SetupData;
typedef struct _IMGINFO typedef struct _IMGINFO
@ -202,6 +224,7 @@ LangSelDlgProc(HWND hwndDlg,
LPARAM lParam) LPARAM lParam)
{ {
PIMGINFO pImgInfo; PIMGINFO pImgInfo;
LONG i;
pImgInfo = (PIMGINFO)GetWindowLongPtr(hwndDlg, DWLP_USER); pImgInfo = (PIMGINFO)GetWindowLongPtr(hwndDlg, DWLP_USER);
switch (uMsg) switch (uMsg)
{ {
@ -236,6 +259,10 @@ LangSelDlgProc(HWND hwndDlg,
WM_SETFONT, WM_SETFONT,
(WPARAM)hTitleFont, (WPARAM)hTitleFont,
(LPARAM)TRUE);*/ (LPARAM)TRUE);*/
for (i=0; i< SetupData.LangCount;i++)
(void)ComboBox_AddString(GetDlgItem(hwndDlg,IDC_LANGUAGES),SetupData.pLanguages[i].LangName);
for (i=0; i< SetupData.KbLayoutCount;i++)
(void)ComboBox_AddString(GetDlgItem(hwndDlg,IDC_KEYLAYOUT),SetupData.pKbLayouts[i].LayoutName);
} }
break; break;
case WM_DRAWITEM: case WM_DRAWITEM:
@ -566,6 +593,72 @@ RestartDlgProc(HWND hwndDlg,
return FALSE; return FALSE;
} }
void LoadSetupData()
{
WCHAR szPath[MAX_PATH];
WCHAR *ch;
HINF hTxtsetupSif;
INFCONTEXT InfContext;
//TCHAR szValue[MAX_PATH];
DWORD LineLength;
LONG Count;
//HKEY hKey;
GetModuleFileNameW(NULL,szPath,MAX_PATH);
ch = strrchrW(szPath,L'\\');
if (ch != NULL)
*ch = L'\0';
wcscat(szPath, L"\\txtsetup.sif");
hTxtsetupSif = SetupOpenInfFileW(szPath, NULL, INF_STYLE_OLDNT, NULL);
if (hTxtsetupSif != INVALID_HANDLE_VALUE)
{
// get language list
Count = SetupGetLineCount(hTxtsetupSif, _T("Language"));
if (Count > 0)
{
// TODO: alloc memory for all entries and read entries
SetupData.pLanguages = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LANG) * Count);
if (SetupData.pLanguages != NULL)
{
SetupData.LangCount = Count;
Count = 0;
if (SetupFindFirstLine(hTxtsetupSif, _T("Language"),
NULL,&InfContext))
do
{
SetupGetStringField(&InfContext, 0, SetupData.pLanguages[Count].LangId, sizeof(SetupData.pLanguages[Count].LangId) / sizeof(TCHAR), &LineLength);
SetupGetStringField(&InfContext, 1, SetupData.pLanguages[Count].LangName, sizeof(SetupData.pLanguages[Count].LangName) / sizeof(TCHAR), &LineLength);
++Count;
}
while (SetupFindNextLine(&InfContext, &InfContext) && Count < SetupData.LangCount);
}
}
// get keyboard layout list
Count = SetupGetLineCount(hTxtsetupSif, _T("KeyboardLayout"));
if (Count > 0)
{
// TODO: alloc memory for all entries and read entries
SetupData.pKbLayouts = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(KBLAYOUT) * Count);
if (SetupData.pKbLayouts != NULL)
{
SetupData.KbLayoutCount = Count;
Count = 0;
if (SetupFindFirstLine(hTxtsetupSif, _T("KeyboardLayout"),
NULL,&InfContext))
do
{
SetupGetStringField(&InfContext, 0, SetupData.pKbLayouts[Count].LayoutId, sizeof(SetupData.pKbLayouts[Count].LayoutId) / sizeof(TCHAR), &LineLength);
SetupGetStringField(&InfContext, 1, SetupData.pKbLayouts[Count].LayoutName, sizeof(SetupData.pKbLayouts[Count].LayoutName) / sizeof(TCHAR), &LineLength);
++Count;
}
while (SetupFindNextLine(&InfContext, &InfContext) && Count < SetupData.LangCount);
}
}
SetupCloseInfFile(hTxtsetupSif);
}
}
BOOL isUnattendSetup() BOOL isUnattendSetup()
{ {
WCHAR szPath[MAX_PATH]; WCHAR szPath[MAX_PATH];
@ -621,6 +714,8 @@ WinMain(HINSTANCE hInst,
LoadString(hInst,IDS_ABORTSETUP, abort_msg, sizeof(abort_msg)/sizeof(TCHAR)); LoadString(hInst,IDS_ABORTSETUP, abort_msg, sizeof(abort_msg)/sizeof(TCHAR));
LoadString(hInst,IDS_ABORTSETUP2, abort_title,sizeof(abort_title)/sizeof(TCHAR)); LoadString(hInst,IDS_ABORTSETUP2, abort_title,sizeof(abort_title)/sizeof(TCHAR));
LoadSetupData();
/* Create the Start page, until setup is working */ /* Create the Start page, until setup is working */
psp.dwSize = sizeof(PROPSHEETPAGE); psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER; psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER;