reactos/dll/cpl/input/add_dialog.c

195 lines
5.7 KiB
C

/*
* PROJECT: input.dll
* FILE: dll/cpl/input/add_dialog.c
* PURPOSE: input.dll
* PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
*/
#include "input.h"
#include "locale_list.h"
#include "layout_list.h"
#include "input_list.h"
static DWORD
GetDefaultLayoutForLocale(DWORD dwLocaleId)
{
DWORD dwResult = 0;
HINF hIntlInf;
hIntlInf = SetupOpenInfFileW(L"intl.inf", NULL, INF_STYLE_WIN4, NULL);
if (hIntlInf != INVALID_HANDLE_VALUE)
{
WCHAR szLangID[MAX_STR_LEN];
INFCONTEXT InfContext;
StringCchPrintfW(szLangID, ARRAYSIZE(szLangID), L"%08X", dwLocaleId);
if (SetupFindFirstLineW(hIntlInf, L"Locales", szLangID, &InfContext))
{
if (SetupGetFieldCount(&InfContext) >= 5)
{
WCHAR szField[MAX_STR_LEN];
if (SetupGetStringFieldW(&InfContext, 5, szField, ARRAYSIZE(szField), NULL))
{
if (wcslen(szField) == 13) // like 0409:00000409 (13 chars)
{
WCHAR *pszSeparator = L":";
WCHAR *pszToken;
pszToken = wcstok(szField, pszSeparator);
if (pszToken != NULL)
pszToken = wcstok(NULL, pszSeparator);
if (pszToken != NULL)
{
dwResult = DWORDfromString(pszToken);
}
}
}
}
}
SetupCloseInfFile(hIntlInf);
}
return dwResult;
}
static VOID
OnInitAddDialog(HWND hwndDlg)
{
HWND hwndLocaleCombo = GetDlgItem(hwndDlg, IDC_INPUT_LANG_COMBO);
HWND hwndLayoutCombo = GetDlgItem(hwndDlg, IDC_KEYBOARD_LO_COMBO);
LOCALE_LIST_NODE *pCurrentLocale;
LAYOUT_LIST_NODE *pCurrentLayout;
DWORD dwDefaultLocaleId;
DWORD dwDefaultLayoutId;
INT iItemIndex;
dwDefaultLocaleId = GetSystemDefaultLCID();
for (pCurrentLocale = LocaleList_GetFirst();
pCurrentLocale != NULL;
pCurrentLocale = pCurrentLocale->pNext)
{
iItemIndex = ComboBox_AddString(hwndLocaleCombo, pCurrentLocale->pszName);
ComboBox_SetItemData(hwndLocaleCombo, iItemIndex, pCurrentLocale);
if (pCurrentLocale->dwId == dwDefaultLocaleId)
{
ComboBox_SetCurSel(hwndLocaleCombo, iItemIndex);
}
}
dwDefaultLayoutId = GetDefaultLayoutForLocale(dwDefaultLocaleId);
for (pCurrentLayout = LayoutList_GetFirst();
pCurrentLayout != NULL;
pCurrentLayout = pCurrentLayout->pNext)
{
iItemIndex = ComboBox_AddString(hwndLayoutCombo, pCurrentLayout->pszName);
ComboBox_SetItemData(hwndLayoutCombo, iItemIndex, pCurrentLayout);
if (pCurrentLayout->dwId == dwDefaultLayoutId)
{
ComboBox_SetCurSel(hwndLayoutCombo, iItemIndex);
}
}
if (dwDefaultLayoutId == 0)
ComboBox_SetCurSel(hwndLayoutCombo, 0);
}
static VOID
OnCommandAddDialog(HWND hwndDlg, WPARAM wParam)
{
switch (LOWORD(wParam))
{
case IDOK:
{
HWND hwndLocaleCombo = GetDlgItem(hwndDlg, IDC_INPUT_LANG_COMBO);
HWND hwndLayoutCombo = GetDlgItem(hwndDlg, IDC_KEYBOARD_LO_COMBO);
LOCALE_LIST_NODE *pCurrentLocale;
LAYOUT_LIST_NODE *pCurrentLayout;
pCurrentLocale = (LOCALE_LIST_NODE*)ComboBox_GetItemData(hwndLocaleCombo,
ComboBox_GetCurSel(hwndLocaleCombo));
pCurrentLayout = (LAYOUT_LIST_NODE*)ComboBox_GetItemData(hwndLayoutCombo,
ComboBox_GetCurSel(hwndLayoutCombo));
InputList_Add(pCurrentLocale, pCurrentLayout);
EndDialog(hwndDlg, LOWORD(wParam));
}
break;
case IDCANCEL:
{
EndDialog(hwndDlg, LOWORD(wParam));
}
break;
case IDC_INPUT_LANG_COMBO:
{
if (HIWORD(wParam) == CBN_SELCHANGE)
{
HWND hwndLocaleCombo = GetDlgItem(hwndDlg, IDC_INPUT_LANG_COMBO);
HWND hwndLayoutCombo = GetDlgItem(hwndDlg, IDC_KEYBOARD_LO_COMBO);
LOCALE_LIST_NODE *pCurrentLocale;
pCurrentLocale = (LOCALE_LIST_NODE*)ComboBox_GetItemData(hwndLocaleCombo,
ComboBox_GetCurSel(hwndLocaleCombo));
if (pCurrentLocale != NULL)
{
DWORD dwLayoutId;
INT iIndex;
INT iCount;
dwLayoutId = GetDefaultLayoutForLocale(pCurrentLocale->dwId);
iCount = ComboBox_GetCount(hwndLayoutCombo);
for (iIndex = 0; iIndex < iCount; iIndex++)
{
LAYOUT_LIST_NODE *pCurrentLayout;
pCurrentLayout = (LAYOUT_LIST_NODE*)ComboBox_GetItemData(hwndLayoutCombo, iIndex);
if (pCurrentLayout != NULL && pCurrentLayout->dwId == dwLayoutId)
{
ComboBox_SetCurSel(hwndLayoutCombo, iIndex);
break;
}
}
}
}
}
break;
}
}
INT_PTR CALLBACK
AddDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
OnInitAddDialog(hwndDlg);
break;
case WM_COMMAND:
OnCommandAddDialog(hwndDlg, wParam);
break;
case WM_DESTROY:
break;
}
return FALSE;
}