Sync with trunk r58687.
[reactos.git] / dll / cpl / console / options.c
1 /*
2 * PROJECT: ReactOS Console Configuration DLL
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/console/options.c
5 * PURPOSE: displays options dialog
6 * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@student.tugraz.at)
7 */
8
9 #include "console.h"
10
11 #define NDEBUG
12 #include <debug.h>
13
14 static
15 void
16 UpdateDialogElements(HWND hwndDlg, PCONSOLE_PROPS pConInfo);
17
18 INT_PTR
19 CALLBACK
20 OptionsProc(HWND hwndDlg,
21 UINT uMsg,
22 WPARAM wParam,
23 LPARAM lParam)
24 {
25 PCONSOLE_PROPS pConInfo;
26 LRESULT lResult;
27 HWND hDlgCtrl;
28 LPPSHNOTIFY lppsn;
29
30 pConInfo = (PCONSOLE_PROPS)GetWindowLongPtr(hwndDlg, DWLP_USER);
31
32 switch (uMsg)
33 {
34 case WM_INITDIALOG:
35 {
36 pConInfo = (PCONSOLE_PROPS)((LPPROPSHEETPAGE)lParam)->lParam;
37 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pConInfo);
38 UpdateDialogElements(hwndDlg, pConInfo);
39 return TRUE;
40 }
41 case WM_NOTIFY:
42 {
43 if (!pConInfo) break;
44
45 lppsn = (LPPSHNOTIFY) lParam;
46 if (lppsn->hdr.code == UDN_DELTAPOS)
47 {
48 hDlgCtrl = GetDlgItem(hwndDlg, IDC_EDIT_BUFFER_SIZE);
49 pConInfo->ci.HistoryBufferSize = LOWORD(SendMessage(hDlgCtrl, UDM_GETPOS, 0, 0));
50
51 hDlgCtrl = GetDlgItem(hwndDlg, IDC_EDIT_NUM_BUFFER);
52 pConInfo->ci.NumberOfHistoryBuffers = LOWORD(SendMessage(hDlgCtrl, UDM_GETPOS, 0, 0));
53 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
54 }
55 else if (lppsn->hdr.code == PSN_APPLY)
56 {
57 if (!pConInfo->AppliedConfig)
58 {
59 return ApplyConsoleInfo(hwndDlg, pConInfo);
60 }
61 else
62 {
63 /* Options have already been applied */
64 SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
65 return TRUE;
66 }
67 }
68 break;
69 }
70 case WM_COMMAND:
71 {
72 if (!pConInfo) break;
73
74 switch (LOWORD(wParam))
75 {
76 case IDC_RADIO_SMALL_CURSOR:
77 {
78 pConInfo->ci.CursorSize = 25;
79 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
80 break;
81 }
82 case IDC_RADIO_MEDIUM_CURSOR:
83 {
84 pConInfo->ci.CursorSize = 50;
85 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
86 break;
87 }
88 case IDC_RADIO_LARGE_CURSOR:
89 {
90 pConInfo->ci.CursorSize = 100;
91 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
92 break;
93 }
94 case IDC_RADIO_DISPLAY_WINDOW:
95 {
96 pConInfo->ci.FullScreen = FALSE;
97 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
98 break;
99 }
100 case IDC_RADIO_DISPLAY_FULL:
101 {
102 pConInfo->ci.FullScreen = TRUE;
103 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
104 break;
105 }
106 case IDC_CHECK_QUICK_EDIT:
107 {
108 lResult = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0);
109 if (lResult == BST_CHECKED)
110 {
111 pConInfo->ci.QuickEdit = FALSE;
112 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
113 }
114 else if (lResult == BST_UNCHECKED)
115 {
116 pConInfo->ci.QuickEdit = TRUE;
117 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
118 }
119 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
120 break;
121 }
122 case IDC_CHECK_INSERT_MODE:
123 {
124 lResult = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0);
125 if (lResult == BST_CHECKED)
126 {
127 pConInfo->ci.InsertMode = FALSE;
128 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
129 }
130 else if (lResult == BST_UNCHECKED)
131 {
132 pConInfo->ci.InsertMode = TRUE;
133 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
134 }
135 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
136 break;
137 }
138 case IDC_CHECK_DISCARD_DUPLICATES:
139 {
140 lResult = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0);
141 if (lResult == BST_CHECKED)
142 {
143 pConInfo->ci.HistoryNoDup = FALSE;
144 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
145 }
146 else if (lResult == BST_UNCHECKED)
147 {
148 pConInfo->ci.HistoryNoDup = TRUE;
149 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
150 }
151 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
152 break;
153 }
154 default:
155 break;
156 }
157 break;
158 }
159 default:
160 break;
161 }
162
163 return FALSE;
164 }
165
166 static
167 void
168 UpdateDialogElements(HWND hwndDlg, PCONSOLE_PROPS pConInfo)
169 {
170 HWND hDlgCtrl;
171 TCHAR szBuffer[MAX_PATH];
172
173 /* Update cursor size */
174 if (pConInfo->ci.CursorSize <= 25)
175 {
176 /* Small cursor */
177 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_SMALL_CURSOR);
178 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
179
180 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_MEDIUM_CURSOR);
181 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
182 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_LARGE_CURSOR);
183 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
184 }
185 else if (pConInfo->ci.CursorSize <= 50)
186 {
187 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_MEDIUM_CURSOR);
188 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
189
190 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_SMALL_CURSOR);
191 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
192 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_LARGE_CURSOR);
193 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
194 }
195 else /* if (pConInfo->ci.CursorSize <= 100) */
196 {
197 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_LARGE_CURSOR);
198 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
199
200 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_SMALL_CURSOR);
201 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
202 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_MEDIUM_CURSOR);
203 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
204 }
205
206 /* Update num buffers */
207 hDlgCtrl = GetDlgItem(hwndDlg, IDC_UPDOWN_NUM_BUFFER);
208 SendMessage(hDlgCtrl, UDM_SETRANGE, 0, MAKELONG((short)999, (short)1));
209 hDlgCtrl = GetDlgItem(hwndDlg, IDC_EDIT_NUM_BUFFER);
210 _stprintf(szBuffer, _T("%d"), pConInfo->ci.NumberOfHistoryBuffers);
211 SendMessage(hDlgCtrl, WM_SETTEXT, 0, (LPARAM)szBuffer);
212
213 /* Update buffer size */
214 hDlgCtrl = GetDlgItem(hwndDlg, IDC_UPDOWN_BUFFER_SIZE);
215 SendMessage(hDlgCtrl, UDM_SETRANGE, 0, MAKELONG((short)999, (short)1));
216 hDlgCtrl = GetDlgItem(hwndDlg, IDC_EDIT_BUFFER_SIZE);
217 _stprintf(szBuffer, _T("%d"), pConInfo->ci.HistoryBufferSize);
218 SendMessage(hDlgCtrl, WM_SETTEXT, 0, (LPARAM)szBuffer);
219
220 /* Update discard duplicates */
221 hDlgCtrl = GetDlgItem(hwndDlg, IDC_CHECK_DISCARD_DUPLICATES);
222 if (pConInfo->ci.HistoryNoDup)
223 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
224 else
225 SendMessage(hDlgCtrl, BM_SETCHECK, (LPARAM)BST_UNCHECKED, 0);
226
227 /* Update full/window screen */
228 if (pConInfo->ci.FullScreen)
229 {
230 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_DISPLAY_FULL);
231 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
232
233 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_DISPLAY_WINDOW);
234 SendMessage(hDlgCtrl, BM_SETCHECK, (LPARAM)BST_UNCHECKED, 0);
235 }
236 else
237 {
238 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_DISPLAY_WINDOW);
239 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
240
241 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_DISPLAY_FULL);
242 SendMessage(hDlgCtrl, BM_SETCHECK, (LPARAM)BST_UNCHECKED, 0);
243 }
244
245 /* Update quick edit */
246 hDlgCtrl = GetDlgItem(hwndDlg, IDC_CHECK_QUICK_EDIT);
247 if (pConInfo->ci.QuickEdit)
248 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
249 else
250 SendMessage(hDlgCtrl, BM_SETCHECK, (LPARAM)BST_UNCHECKED, 0);
251
252 /* Update insert mode */
253 hDlgCtrl = GetDlgItem(hwndDlg, IDC_CHECK_INSERT_MODE);
254 if (pConInfo->ci.InsertMode)
255 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
256 else
257 SendMessage(hDlgCtrl, BM_SETCHECK, (LPARAM)BST_UNCHECKED, 0);
258 }