3 * FILE: dll/cpl/input/settings_page.c
5 * PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
9 #include "layout_list.h"
10 #include "locale_list.h"
11 #include "input_list.h"
15 CreateLayoutIcon(LPWSTR szLayout
, BOOL bIsDefault
)
17 INT width
= GetSystemMetrics(SM_CXSMICON
) * 2;
18 INT height
= GetSystemMetrics(SM_CYSMICON
);
25 hdc
= CreateCompatibleDC(hdcsrc
);
26 hBitmap
= CreateCompatibleBitmap(hdcsrc
, width
, height
);
28 ReleaseDC(NULL
, hdcsrc
);
34 hBmpNew
= CreateBitmap(width
, height
, 1, 1, NULL
);
39 if (SystemParametersInfoW(SPI_GETICONTITLELOGFONT
, sizeof(lf
), &lf
, 0))
44 hFont
= CreateFontIndirectW(&lf
);
50 hBmpOld
= SelectObject(hdc
, hBitmap
);
56 SetRect(&rect
, 0, 0, width
/ 2, height
);
58 if (bIsDefault
!= FALSE
)
60 SetBkColor(hdc
, GetSysColor(COLOR_WINDOW
));
61 SetTextColor(hdc
, GetSysColor(COLOR_WINDOWTEXT
));
63 ExtTextOutW(hdc
, rect
.left
, rect
.top
, ETO_OPAQUE
, &rect
, L
"", 0, NULL
);
65 SelectObject(hdc
, hFont
);
66 DrawTextW(hdc
, L
"\x2022", 1, &rect
, DT_SINGLELINE
| DT_CENTER
| DT_VCENTER
);
70 FillRect(hdc
, &rect
, GetSysColorBrush(COLOR_WINDOW
));
73 SetRect(&rect
, width
/ 2, 0, width
, height
);
75 SetBkColor(hdc
, GetSysColor(COLOR_HIGHLIGHT
));
76 SetTextColor(hdc
, GetSysColor(COLOR_HIGHLIGHTTEXT
));
78 ExtTextOutW(hdc
, rect
.left
, rect
.top
, ETO_OPAQUE
, &rect
, L
"", 0, NULL
);
80 SelectObject(hdc
, hFont
);
81 DrawTextW(hdc
, szLayout
, 2, &rect
, DT_SINGLELINE
| DT_CENTER
| DT_VCENTER
);
83 SelectObject(hdc
, hBmpNew
);
85 PatBlt(hdc
, 0, 0, width
, height
, BLACKNESS
);
87 SelectObject(hdc
, hBmpOld
);
89 IconInfo
.hbmColor
= hBitmap
;
90 IconInfo
.hbmMask
= hBmpNew
;
91 IconInfo
.fIcon
= TRUE
;
93 hIcon
= CreateIconIndirect(&IconInfo
);
95 DeleteObject(hBmpOld
);
102 DeleteObject(hBmpNew
);
107 DeleteObject(hBitmap
);
114 SetControlsState(HWND hwndDlg
, BOOL bIsEnabled
)
116 EnableWindow(GetDlgItem(hwndDlg
, IDC_REMOVE_BUTTON
), bIsEnabled
);
117 EnableWindow(GetDlgItem(hwndDlg
, IDC_PROP_BUTTON
), bIsEnabled
);
118 EnableWindow(GetDlgItem(hwndDlg
, IDC_SET_DEFAULT
), bIsEnabled
);
123 AddToInputListView(HWND hwndList
, INPUT_LIST_NODE
*pInputNode
)
128 HIMAGELIST hImageList
;
130 hImageList
= ListView_GetImageList(hwndList
, LVSIL_SMALL
);
132 if (hImageList
!= NULL
)
136 hLayoutIcon
= CreateLayoutIcon(pInputNode
->pszIndicator
,
137 (pInputNode
->wFlags
& INPUT_LIST_NODE_FLAG_DEFAULT
));
139 if (hLayoutIcon
!= NULL
)
141 ImageIndex
= ImageList_AddIcon(hImageList
, hLayoutIcon
);
142 DestroyIcon(hLayoutIcon
);
146 ZeroMemory(&item
, sizeof(item
));
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
;
154 ItemIndex
= ListView_InsertItem(hwndList
, &item
);
156 ListView_SetItemText(hwndList
, ItemIndex
, 1, pInputNode
->pLayout
->pszName
);
161 UpdateInputListView(HWND hwndList
)
163 INPUT_LIST_NODE
*pCurrentInputNode
;
164 HIMAGELIST hImageList
;
166 hImageList
= ListView_GetImageList(hwndList
, LVSIL_SMALL
);
167 if (hImageList
!= NULL
)
169 ImageList_RemoveAll(hImageList
);
172 ListView_DeleteAllItems(hwndList
);
174 for (pCurrentInputNode
= InputList_GetFirst();
175 pCurrentInputNode
!= NULL
;
176 pCurrentInputNode
= pCurrentInputNode
->pNext
)
178 if (!(pCurrentInputNode
->wFlags
& INPUT_LIST_NODE_FLAG_DELETED
))
180 AddToInputListView(hwndList
, pCurrentInputNode
);
187 OnInitSettingsPage(HWND hwndDlg
)
195 hwndInputList
= GetDlgItem(hwndDlg
, IDC_KEYLAYOUT_LIST
);
197 if (hwndInputList
!= NULL
)
199 WCHAR szBuffer
[MAX_STR_LEN
];
200 HIMAGELIST hLayoutImageList
;
203 ListView_SetExtendedListViewStyle(hwndInputList
, LVS_EX_FULLROWSELECT
);
205 ZeroMemory(&column
, sizeof(column
));
207 column
.mask
= LVCF_FMT
| LVCF_TEXT
| LVCF_WIDTH
| LVCF_SUBITEM
;
209 LoadStringW(hApplet
, IDS_LANGUAGE
, szBuffer
, ARRAYSIZE(szBuffer
));
210 column
.fmt
= LVCFMT_LEFT
;
212 column
.pszText
= szBuffer
;
214 ListView_InsertColumn(hwndInputList
, 0, &column
);
216 LoadStringW(hApplet
, IDS_LAYOUT
, szBuffer
, ARRAYSIZE(szBuffer
));
217 column
.fmt
= LVCFMT_RIGHT
;
220 column
.pszText
= szBuffer
;
221 ListView_InsertColumn(hwndInputList
, 1, &column
);
223 hLayoutImageList
= ImageList_Create(GetSystemMetrics(SM_CXSMICON
) * 2,
224 GetSystemMetrics(SM_CYSMICON
),
225 ILC_COLOR8
| ILC_MASK
, 0, 0);
226 if (hLayoutImageList
!= NULL
)
228 ListView_SetImageList(hwndInputList
, hLayoutImageList
, LVSIL_SMALL
);
231 UpdateInputListView(hwndInputList
);
234 SetControlsState(hwndDlg
, FALSE
);
239 OnDestroySettingsPage(HWND hwndDlg
)
241 HIMAGELIST hImageList
;
243 LayoutList_Destroy();
244 LocaleList_Destroy();
247 hImageList
= ListView_GetImageList(GetDlgItem(hwndDlg
, IDC_KEYLAYOUT_LIST
),
249 if (hImageList
!= NULL
)
251 ImageList_Destroy(hImageList
);
257 OnCommandSettingsPage(HWND hwndDlg
, WPARAM wParam
)
259 switch (LOWORD(wParam
))
263 if (DialogBoxW(hApplet
,
264 MAKEINTRESOURCEW(IDD_ADD
),
266 AddDialogProc
) == IDOK
)
268 UpdateInputListView(GetDlgItem(hwndDlg
, IDC_KEYLAYOUT_LIST
));
269 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
274 case IDC_REMOVE_BUTTON
:
278 hwndList
= GetDlgItem(hwndDlg
, IDC_KEYLAYOUT_LIST
);
280 if (hwndList
!= NULL
)
284 item
.mask
= LVIF_PARAM
;
285 item
.iItem
= ListView_GetNextItem(hwndList
, -1, LVNI_SELECTED
);
287 if (ListView_GetItem(hwndList
, &item
) != FALSE
)
289 InputList_Remove((INPUT_LIST_NODE
*) item
.lParam
);
290 UpdateInputListView(hwndList
);
291 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
297 case IDC_PROP_BUTTON
:
301 hwndList
= GetDlgItem(hwndDlg
, IDC_KEYLAYOUT_LIST
);
303 if (hwndList
!= NULL
)
307 item
.mask
= LVIF_PARAM
;
308 item
.iItem
= ListView_GetNextItem(hwndList
, -1, LVNI_SELECTED
);
310 if (ListView_GetItem(hwndList
, &item
) != FALSE
)
312 if (DialogBoxParamW(hApplet
,
313 MAKEINTRESOURCEW(IDD_INPUT_LANG_PROP
),
316 item
.lParam
) == IDOK
)
318 UpdateInputListView(hwndList
);
319 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
326 case IDC_SET_DEFAULT
:
330 hwndList
= GetDlgItem(hwndDlg
, IDC_KEYLAYOUT_LIST
);
332 if (hwndList
!= NULL
)
336 item
.mask
= LVIF_PARAM
;
337 item
.iItem
= ListView_GetNextItem(hwndList
, -1, LVNI_SELECTED
);
339 if (ListView_GetItem(hwndList
, &item
) != FALSE
)
341 InputList_SetDefault((INPUT_LIST_NODE
*) item
.lParam
);
342 UpdateInputListView(hwndList
);
343 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
349 case IDC_KEY_SET_BTN
:
352 MAKEINTRESOURCEW(IDD_KEYSETTINGS
),
354 KeySettingsDialogProc
);
362 OnNotifySettingsPage(HWND hwndDlg
, LPARAM lParam
)
366 header
= (LPNMHDR
)lParam
;
368 switch (header
->code
)
372 if (header
->idFrom
== IDC_KEYLAYOUT_LIST
)
374 INT iSelected
= ListView_GetNextItem(header
->hwndFrom
, -1, LVNI_SELECTED
);
380 SetControlsState(hwndDlg
, TRUE
);
382 item
.mask
= LVIF_PARAM
;
383 item
.iItem
= iSelected
;
385 if (ListView_GetItem(header
->hwndFrom
, &item
) != FALSE
)
387 INPUT_LIST_NODE
*pInput
;
389 pInput
= (INPUT_LIST_NODE
*) item
.lParam
;
391 if (pInput
!= NULL
&& pInput
->wFlags
& INPUT_LIST_NODE_FLAG_DEFAULT
)
393 EnableWindow(GetDlgItem(hwndDlg
, IDC_SET_DEFAULT
), FALSE
);
399 SetControlsState(hwndDlg
, FALSE
);
407 /* Write Input Methods list to registry */
416 SettingsPageProc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
421 OnInitSettingsPage(hwndDlg
);
425 OnDestroySettingsPage(hwndDlg
);
429 OnCommandSettingsPage(hwndDlg
, wParam
);
433 OnNotifySettingsPage(hwndDlg
, lParam
);