1 /* 2 * PROJECT: input.dll 3 * FILE: dll/cpl/input/add_dialog.c 4 * PURPOSE: input.dll 5 * PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org) 6 */ 7 8 #include "input.h" 9 #include "locale_list.h" 10 #include "layout_list.h" 11 #include "input_list.h" 12 13 14 static DWORD 15 GetDefaultLayoutForLocale(DWORD dwLocaleId) 16 { 17 DWORD dwResult = 0; 18 HINF hIntlInf; 19 20 hIntlInf = SetupOpenInfFileW(L"intl.inf", NULL, INF_STYLE_WIN4, NULL); 21 if (hIntlInf != INVALID_HANDLE_VALUE) 22 { 23 WCHAR szLangID[MAX_STR_LEN]; 24 INFCONTEXT InfContext; 25 26 StringCchPrintfW(szLangID, ARRAYSIZE(szLangID), L"%08X", dwLocaleId); 27 28 if (SetupFindFirstLineW(hIntlInf, L"Locales", szLangID, &InfContext)) 29 { 30 if (SetupGetFieldCount(&InfContext) >= 5) 31 { 32 WCHAR szField[MAX_STR_LEN]; 33 34 if (SetupGetStringFieldW(&InfContext, 5, szField, ARRAYSIZE(szField), NULL)) 35 { 36 if (wcslen(szField) == 13) // like 0409:00000409 (13 chars) 37 { 38 WCHAR *pszSeparator = L":"; 39 WCHAR *pszToken; 40 41 pszToken = wcstok(szField, pszSeparator); 42 if (pszToken != NULL) 43 pszToken = wcstok(NULL, pszSeparator); 44 45 if (pszToken != NULL) 46 { 47 dwResult = DWORDfromString(pszToken); 48 } 49 } 50 } 51 } 52 } 53 54 SetupCloseInfFile(hIntlInf); 55 } 56 57 return dwResult; 58 } 59 60 61 static VOID 62 OnInitAddDialog(HWND hwndDlg) 63 { 64 HWND hwndLocaleCombo = GetDlgItem(hwndDlg, IDC_INPUT_LANG_COMBO); 65 HWND hwndLayoutCombo = GetDlgItem(hwndDlg, IDC_KEYBOARD_LO_COMBO); 66 LOCALE_LIST_NODE *pCurrentLocale; 67 LAYOUT_LIST_NODE *pCurrentLayout; 68 DWORD dwDefaultLocaleId; 69 DWORD dwDefaultLayoutId; 70 INT iItemIndex; 71 72 dwDefaultLocaleId = GetSystemDefaultLCID(); 73 74 for (pCurrentLocale = LocaleList_GetFirst(); 75 pCurrentLocale != NULL; 76 pCurrentLocale = pCurrentLocale->pNext) 77 { 78 iItemIndex = ComboBox_AddString(hwndLocaleCombo, pCurrentLocale->pszName); 79 ComboBox_SetItemData(hwndLocaleCombo, iItemIndex, pCurrentLocale); 80 81 if (pCurrentLocale->dwId == dwDefaultLocaleId) 82 { 83 ComboBox_SetCurSel(hwndLocaleCombo, iItemIndex); 84 } 85 } 86 87 dwDefaultLayoutId = GetDefaultLayoutForLocale(dwDefaultLocaleId); 88 89 for (pCurrentLayout = LayoutList_GetFirst(); 90 pCurrentLayout != NULL; 91 pCurrentLayout = pCurrentLayout->pNext) 92 { 93 iItemIndex = ComboBox_AddString(hwndLayoutCombo, pCurrentLayout->pszName); 94 ComboBox_SetItemData(hwndLayoutCombo, iItemIndex, pCurrentLayout); 95 96 if (pCurrentLayout->dwKLID == dwDefaultLayoutId) 97 { 98 ComboBox_SetCurSel(hwndLayoutCombo, iItemIndex); 99 } 100 } 101 102 if (dwDefaultLayoutId == 0) 103 ComboBox_SetCurSel(hwndLayoutCombo, 0); 104 } 105 106 107 static VOID 108 OnCommandAddDialog(HWND hwndDlg, WPARAM wParam) 109 { 110 switch (LOWORD(wParam)) 111 { 112 case IDOK: 113 { 114 HWND hwndLocaleCombo = GetDlgItem(hwndDlg, IDC_INPUT_LANG_COMBO); 115 HWND hwndLayoutCombo = GetDlgItem(hwndDlg, IDC_KEYBOARD_LO_COMBO); 116 LOCALE_LIST_NODE *pCurrentLocale; 117 LAYOUT_LIST_NODE *pCurrentLayout; 118 119 pCurrentLocale = (LOCALE_LIST_NODE*)ComboBox_GetItemData(hwndLocaleCombo, 120 ComboBox_GetCurSel(hwndLocaleCombo)); 121 pCurrentLayout = (LAYOUT_LIST_NODE*)ComboBox_GetItemData(hwndLayoutCombo, 122 ComboBox_GetCurSel(hwndLayoutCombo)); 123 124 InputList_Add(pCurrentLocale, pCurrentLayout); 125 126 EndDialog(hwndDlg, LOWORD(wParam)); 127 } 128 break; 129 130 case IDCANCEL: 131 { 132 EndDialog(hwndDlg, LOWORD(wParam)); 133 } 134 break; 135 136 case IDC_INPUT_LANG_COMBO: 137 { 138 if (HIWORD(wParam) == CBN_SELCHANGE) 139 { 140 HWND hwndLocaleCombo = GetDlgItem(hwndDlg, IDC_INPUT_LANG_COMBO); 141 HWND hwndLayoutCombo = GetDlgItem(hwndDlg, IDC_KEYBOARD_LO_COMBO); 142 LOCALE_LIST_NODE *pCurrentLocale; 143 144 pCurrentLocale = (LOCALE_LIST_NODE*)ComboBox_GetItemData(hwndLocaleCombo, 145 ComboBox_GetCurSel(hwndLocaleCombo)); 146 if (pCurrentLocale != NULL) 147 { 148 DWORD dwLayoutId; 149 INT iIndex; 150 INT iCount; 151 152 dwLayoutId = GetDefaultLayoutForLocale(pCurrentLocale->dwId); 153 154 iCount = ComboBox_GetCount(hwndLayoutCombo); 155 156 for (iIndex = 0; iIndex < iCount; iIndex++) 157 { 158 LAYOUT_LIST_NODE *pCurrentLayout; 159 160 pCurrentLayout = (LAYOUT_LIST_NODE*)ComboBox_GetItemData(hwndLayoutCombo, iIndex); 161 162 if (pCurrentLayout != NULL && pCurrentLayout->dwKLID == dwLayoutId) 163 { 164 ComboBox_SetCurSel(hwndLayoutCombo, iIndex); 165 break; 166 } 167 } 168 } 169 } 170 } 171 break; 172 } 173 } 174 175 176 INT_PTR CALLBACK 177 AddDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 178 { 179 switch (uMsg) 180 { 181 case WM_INITDIALOG: 182 OnInitAddDialog(hwndDlg); 183 return TRUE; 184 185 case WM_COMMAND: 186 OnCommandAddDialog(hwndDlg, wParam); 187 break; 188 189 case WM_DESTROY: 190 break; 191 } 192 193 return FALSE; 194 } 195