Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / dll / cpl / input / settings_page.c
1 /*
2 * PROJECT: input.dll
3 * FILE: dll/cpl/input/settings_page.c
4 * PURPOSE: input.dll
5 * PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
6 */
7
8 #include "input.h"
9 #include "layout_list.h"
10 #include "locale_list.h"
11 #include "input_list.h"
12
13
14 static HICON
15 CreateLayoutIcon(LPWSTR szLayout, BOOL bIsDefault)
16 {
17 INT width = GetSystemMetrics(SM_CXSMICON) * 2;
18 INT height = GetSystemMetrics(SM_CYSMICON);
19 HDC hdc;
20 HDC hdcsrc;
21 HBITMAP hBitmap;
22 HICON hIcon = NULL;
23
24 hdcsrc = GetDC(NULL);
25 hdc = CreateCompatibleDC(hdcsrc);
26 hBitmap = CreateCompatibleBitmap(hdcsrc, width, height);
27
28 ReleaseDC(NULL, hdcsrc);
29
30 if (hdc && hBitmap)
31 {
32 HBITMAP hBmpNew;
33
34 hBmpNew = CreateBitmap(width, height, 1, 1, NULL);
35 if (hBmpNew)
36 {
37 LOGFONTW lf;
38
39 if (SystemParametersInfoW(SPI_GETICONTITLELOGFONT, sizeof(lf), &lf, 0))
40 {
41 ICONINFO IconInfo;
42 HFONT hFont;
43
44 hFont = CreateFontIndirectW(&lf);
45
46 if (hFont != NULL)
47 {
48 HBITMAP hBmpOld;
49
50 hBmpOld = SelectObject(hdc, hBitmap);
51
52 if (hBmpOld != NULL)
53 {
54 RECT rect;
55
56 SetRect(&rect, 0, 0, width / 2, height);
57
58 if (bIsDefault != FALSE)
59 {
60 SetBkColor(hdc, GetSysColor(COLOR_WINDOW));
61 SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT));
62
63 ExtTextOutW(hdc, rect.left, rect.top, ETO_OPAQUE, &rect, L"", 0, NULL);
64
65 SelectObject(hdc, hFont);
66 DrawTextW(hdc, L"\x2022", 1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
67 }
68 else
69 {
70 FillRect(hdc, &rect, GetSysColorBrush(COLOR_WINDOW));
71 }
72
73 SetRect(&rect, width / 2, 0, width, height);
74
75 SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
76 SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
77
78 ExtTextOutW(hdc, rect.left, rect.top, ETO_OPAQUE, &rect, L"", 0, NULL);
79
80 SelectObject(hdc, hFont);
81 DrawTextW(hdc, szLayout, 2, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
82
83 SelectObject(hdc, hBmpNew);
84
85 PatBlt(hdc, 0, 0, width, height, BLACKNESS);
86
87 SelectObject(hdc, hBmpOld);
88
89 IconInfo.hbmColor = hBitmap;
90 IconInfo.hbmMask = hBmpNew;
91 IconInfo.fIcon = TRUE;
92
93 hIcon = CreateIconIndirect(&IconInfo);
94
95 DeleteObject(hBmpOld);
96 }
97
98 DeleteObject(hFont);
99 }
100 }
101
102 DeleteObject(hBmpNew);
103 }
104 }
105
106 DeleteDC(hdc);
107 DeleteObject(hBitmap);
108
109 return hIcon;
110 }
111
112
113 static VOID
114 SetControlsState(HWND hwndDlg, BOOL bIsEnabled)
115 {
116 EnableWindow(GetDlgItem(hwndDlg, IDC_REMOVE_BUTTON), bIsEnabled);
117 EnableWindow(GetDlgItem(hwndDlg, IDC_PROP_BUTTON), bIsEnabled);
118 EnableWindow(GetDlgItem(hwndDlg, IDC_SET_DEFAULT), bIsEnabled);
119 }
120
121
122 static VOID
123 AddToInputListView(HWND hwndList, INPUT_LIST_NODE *pInputNode)
124 {
125 INT ItemIndex = -1;
126 INT ImageIndex = -1;
127 LV_ITEM item;
128 HIMAGELIST hImageList;
129
130 hImageList = ListView_GetImageList(hwndList, LVSIL_SMALL);
131
132 if (hImageList != NULL)
133 {
134 HICON hLayoutIcon;
135
136 hLayoutIcon = CreateLayoutIcon(pInputNode->pszIndicator,
137 (pInputNode->wFlags & INPUT_LIST_NODE_FLAG_DEFAULT));
138
139 if (hLayoutIcon != NULL)
140 {
141 ImageIndex = ImageList_AddIcon(hImageList, hLayoutIcon);
142 DestroyIcon(hLayoutIcon);
143 }
144 }
145
146 ZeroMemory(&item, sizeof(item));
147
148 item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
149 item.pszText = pInputNode->pLocale->pszName;
150 item.iItem = ListView_GetItemCount(hwndList) + 1;
151 item.lParam = (LPARAM)pInputNode;
152 item.iImage = ImageIndex;
153
154 ItemIndex = ListView_InsertItem(hwndList, &item);
155
156 ListView_SetItemText(hwndList, ItemIndex, 1, pInputNode->pLayout->pszName);
157 }
158
159
160 static VOID
161 UpdateInputListView(HWND hwndList)
162 {
163 INPUT_LIST_NODE *pCurrentInputNode;
164 HIMAGELIST hImageList;
165
166 hImageList = ListView_GetImageList(hwndList, LVSIL_SMALL);
167 if (hImageList != NULL)
168 {
169 ImageList_RemoveAll(hImageList);
170 }
171
172 ListView_DeleteAllItems(hwndList);
173
174 for (pCurrentInputNode = InputList_GetFirst();
175 pCurrentInputNode != NULL;
176 pCurrentInputNode = pCurrentInputNode->pNext)
177 {
178 if (!(pCurrentInputNode->wFlags & INPUT_LIST_NODE_FLAG_DELETED))
179 {
180 AddToInputListView(hwndList, pCurrentInputNode);
181 }
182 }
183 }
184
185
186 static VOID
187 OnInitSettingsPage(HWND hwndDlg)
188 {
189 HWND hwndInputList;
190
191 LayoutList_Create();
192 LocaleList_Create();
193 InputList_Create();
194
195 hwndInputList = GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST);
196
197 if (hwndInputList != NULL)
198 {
199 WCHAR szBuffer[MAX_STR_LEN];
200 HIMAGELIST hLayoutImageList;
201 LV_COLUMN column;
202
203 ListView_SetExtendedListViewStyle(hwndInputList, LVS_EX_FULLROWSELECT);
204
205 ZeroMemory(&column, sizeof(column));
206
207 column.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
208
209 LoadStringW(hApplet, IDS_LANGUAGE, szBuffer, ARRAYSIZE(szBuffer));
210 column.fmt = LVCFMT_LEFT;
211 column.iSubItem = 0;
212 column.pszText = szBuffer;
213 column.cx = 175;
214 ListView_InsertColumn(hwndInputList, 0, &column);
215
216 LoadStringW(hApplet, IDS_LAYOUT, szBuffer, ARRAYSIZE(szBuffer));
217 column.fmt = LVCFMT_RIGHT;
218 column.cx = 155;
219 column.iSubItem = 1;
220 column.pszText = szBuffer;
221 ListView_InsertColumn(hwndInputList, 1, &column);
222
223 hLayoutImageList = ImageList_Create(GetSystemMetrics(SM_CXSMICON) * 2,
224 GetSystemMetrics(SM_CYSMICON),
225 ILC_COLOR8 | ILC_MASK, 0, 0);
226 if (hLayoutImageList != NULL)
227 {
228 ListView_SetImageList(hwndInputList, hLayoutImageList, LVSIL_SMALL);
229 }
230
231 UpdateInputListView(hwndInputList);
232 }
233
234 SetControlsState(hwndDlg, FALSE);
235 }
236
237
238 static VOID
239 OnDestroySettingsPage(HWND hwndDlg)
240 {
241 HIMAGELIST hImageList;
242
243 LayoutList_Destroy();
244 LocaleList_Destroy();
245 InputList_Destroy();
246
247 hImageList = ListView_GetImageList(GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST),
248 LVSIL_SMALL);
249 if (hImageList != NULL)
250 {
251 ImageList_Destroy(hImageList);
252 }
253 }
254
255
256 VOID
257 OnCommandSettingsPage(HWND hwndDlg, WPARAM wParam)
258 {
259 switch (LOWORD(wParam))
260 {
261 case IDC_ADD_BUTTON:
262 {
263 if (DialogBoxW(hApplet,
264 MAKEINTRESOURCEW(IDD_ADD),
265 hwndDlg,
266 AddDialogProc) == IDOK)
267 {
268 UpdateInputListView(GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST));
269 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
270 }
271 }
272 break;
273
274 case IDC_REMOVE_BUTTON:
275 {
276 HWND hwndList;
277
278 hwndList = GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST);
279
280 if (hwndList != NULL)
281 {
282 LVITEM item = { 0 };
283
284 item.mask = LVIF_PARAM;
285 item.iItem = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
286
287 if (ListView_GetItem(hwndList, &item) != FALSE)
288 {
289 InputList_Remove((INPUT_LIST_NODE*) item.lParam);
290 UpdateInputListView(hwndList);
291 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
292 }
293 }
294 }
295 break;
296
297 case IDC_PROP_BUTTON:
298 {
299 HWND hwndList;
300
301 hwndList = GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST);
302
303 if (hwndList != NULL)
304 {
305 LVITEM item = { 0 };
306
307 item.mask = LVIF_PARAM;
308 item.iItem = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
309
310 if (ListView_GetItem(hwndList, &item) != FALSE)
311 {
312 if (DialogBoxParamW(hApplet,
313 MAKEINTRESOURCEW(IDD_INPUT_LANG_PROP),
314 hwndDlg,
315 EditDialogProc,
316 item.lParam) == IDOK)
317 {
318 UpdateInputListView(hwndList);
319 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
320 }
321 }
322 }
323 }
324 break;
325
326 case IDC_SET_DEFAULT:
327 {
328 HWND hwndList;
329
330 hwndList = GetDlgItem(hwndDlg, IDC_KEYLAYOUT_LIST);
331
332 if (hwndList != NULL)
333 {
334 LVITEM item = { 0 };
335
336 item.mask = LVIF_PARAM;
337 item.iItem = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
338
339 if (ListView_GetItem(hwndList, &item) != FALSE)
340 {
341 InputList_SetDefault((INPUT_LIST_NODE*) item.lParam);
342 UpdateInputListView(hwndList);
343 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
344 }
345 }
346 }
347 break;
348
349 case IDC_KEY_SET_BTN:
350 {
351 DialogBoxW(hApplet,
352 MAKEINTRESOURCEW(IDD_KEYSETTINGS),
353 hwndDlg,
354 KeySettingsDialogProc);
355 }
356 break;
357 }
358 }
359
360
361 static VOID
362 OnNotifySettingsPage(HWND hwndDlg, LPARAM lParam)
363 {
364 LPNMHDR header;
365
366 header = (LPNMHDR)lParam;
367
368 switch (header->code)
369 {
370 case NM_CLICK:
371 {
372 if (header->idFrom == IDC_KEYLAYOUT_LIST)
373 {
374 INT iSelected = ListView_GetNextItem(header->hwndFrom, -1, LVNI_SELECTED);
375
376 if (iSelected != -1)
377 {
378 LVITEM item = { 0 };
379
380 SetControlsState(hwndDlg, TRUE);
381
382 item.mask = LVIF_PARAM;
383 item.iItem = iSelected;
384
385 if (ListView_GetItem(header->hwndFrom, &item) != FALSE)
386 {
387 INPUT_LIST_NODE *pInput;
388
389 pInput = (INPUT_LIST_NODE*) item.lParam;
390
391 if (pInput != NULL && pInput->wFlags & INPUT_LIST_NODE_FLAG_DEFAULT)
392 {
393 EnableWindow(GetDlgItem(hwndDlg, IDC_SET_DEFAULT), FALSE);
394 }
395 }
396 }
397 else
398 {
399 SetControlsState(hwndDlg, FALSE);
400 }
401 }
402 }
403 break;
404
405 case PSN_APPLY:
406 {
407 /* Write Input Methods list to registry */
408 InputList_Process();
409 }
410 break;
411 }
412 }
413
414
415 INT_PTR CALLBACK
416 SettingsPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
417 {
418 switch (uMsg)
419 {
420 case WM_INITDIALOG:
421 OnInitSettingsPage(hwndDlg);
422 break;
423
424 case WM_DESTROY:
425 OnDestroySettingsPage(hwndDlg);
426 break;
427
428 case WM_COMMAND:
429 OnCommandSettingsPage(hwndDlg, wParam);
430 break;
431
432 case WM_NOTIFY:
433 OnNotifySettingsPage(hwndDlg, lParam);
434 break;
435 }
436
437 return FALSE;
438 }