- Merge from trunk up to r45543
[reactos.git] / base / shell / explorer-new / trayprop.c
1 /*
2 * ReactOS Explorer
3 *
4 * Copyright 2006 - 2007 Thomas Weidenmueller <w3seek@reactos.org>
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 #include <precomp.h>
22
23 typedef struct _PROPSHEET_INFO
24 {
25 HWND hTaskbarWnd;
26 HWND hStartWnd;
27 HWND hNotiWnd;
28 HWND hToolWnd;
29
30 HBITMAP hTaskbarBitmap;
31 } PROPSHEET_INFO, *PPROPSHEET_INFO;
32
33
34 static BOOL
35 UpdateTaskbarBitmap(PPROPSHEET_INFO pPropInfo)
36 {
37 HWND hwndLock, hwndHide, hwndGroup, hwndShowQL;
38 HWND hwndBitmap;
39 BOOL bLock, bHide, bGroup, bShowQL;
40 LPTSTR lpImageName = NULL;
41 BOOL bRet = FALSE;
42
43 hwndLock = GetDlgItem(pPropInfo->hTaskbarWnd, IDC_TASKBARPROP_LOCK);
44 hwndHide = GetDlgItem(pPropInfo->hTaskbarWnd, IDC_TASKBARPROP_HIDE);
45 hwndGroup = GetDlgItem(pPropInfo->hTaskbarWnd, IDC_TASKBARPROP_GROUP);
46 hwndShowQL = GetDlgItem(pPropInfo->hTaskbarWnd, IDC_TASKBARPROP_SHOWQL);
47
48 if (hwndLock && hwndHide && hwndGroup && hwndShowQL)
49 {
50 bLock = (SendMessage(hwndLock, BM_GETCHECK, 0, 0) == BST_CHECKED);
51 bHide = (SendMessage(hwndHide, BM_GETCHECK, 0, 0) == BST_CHECKED);
52 bGroup = (SendMessage(hwndGroup, BM_GETCHECK, 0, 0) == BST_CHECKED);
53 bShowQL = (SendMessage(hwndShowQL, BM_GETCHECK, 0, 0) == BST_CHECKED);
54
55 if (bHide)
56 lpImageName = MAKEINTRESOURCE(IDB_TASKBARPROP_AUTOHIDE);
57 else if (bLock && bGroup && bShowQL)
58 lpImageName = MAKEINTRESOURCE(IDB_TASKBARPROP_LOCK_GROUP_QL);
59 else if (bLock && !bGroup && !bShowQL)
60 lpImageName = MAKEINTRESOURCE(IDB_TASKBARPROP_LOCK_NOGROUP_NOQL);
61 else if (bLock && bGroup && !bShowQL)
62 lpImageName = MAKEINTRESOURCE(IDB_TASKBARPROP_LOCK_GROUP_NOQL);
63 else if (bLock && !bGroup && bShowQL)
64 lpImageName = MAKEINTRESOURCE(IDB_TASKBARPROP_LOCK_NOGROUP_QL);
65 else if (!bLock && !bGroup && !bShowQL)
66 lpImageName = MAKEINTRESOURCE(IDB_TASKBARPROP_NOLOCK_NOGROUP_NOQL);
67 else if (!bLock && bGroup && !bShowQL)
68 lpImageName = MAKEINTRESOURCE(IDB_TASKBARPROP_NOLOCK_GROUP_NOQL);
69 else if (!bLock && !bGroup && bShowQL)
70 lpImageName = MAKEINTRESOURCE(IDB_TASKBARPROP_NOLOCK_NOGROUP_QL);
71 else if (!bLock && bGroup && bShowQL)
72 lpImageName = MAKEINTRESOURCE(IDB_TASKBARPROP_NOLOCK_GROUP_QL);
73
74 if (lpImageName)
75 {
76 if (pPropInfo->hTaskbarBitmap)
77 {
78 DeleteObject(pPropInfo->hTaskbarBitmap);
79 }
80
81 pPropInfo->hTaskbarBitmap = LoadImage(hExplorerInstance,
82 lpImageName,
83 IMAGE_BITMAP,
84 0,
85 0,
86 LR_DEFAULTCOLOR);
87 if (pPropInfo->hTaskbarBitmap)
88 {
89 hwndBitmap = GetDlgItem(pPropInfo->hTaskbarWnd,
90 IDC_TASKBARPROP_TASKBARBITMAP);
91 if (hwndBitmap)
92 {
93 SendMessage(hwndBitmap,
94 STM_SETIMAGE,
95 IMAGE_BITMAP,
96 (LPARAM)pPropInfo->hTaskbarBitmap);
97 }
98 }
99 }
100 }
101
102 return bRet;
103 }
104
105 static VOID
106 OnCreateTaskbarPage(HWND hwnd,
107 PPROPSHEET_INFO pPropInfo)
108 {
109 SetWindowLongPtr(hwnd,
110 GWLP_USERDATA,
111 (LONG_PTR)pPropInfo);
112
113 pPropInfo->hTaskbarWnd = hwnd;
114
115 // FIXME: check buttons
116
117 UpdateTaskbarBitmap(pPropInfo);
118 }
119
120 INT_PTR CALLBACK
121 TaskbarPageProc(HWND hwndDlg,
122 UINT uMsg,
123 WPARAM wParam,
124 LPARAM lParam)
125 {
126 PPROPSHEET_INFO pPropInfo;
127
128 /* Get the window context */
129 pPropInfo = (PPROPSHEET_INFO)GetWindowLongPtrW(hwndDlg,
130 GWLP_USERDATA);
131 if (pPropInfo == NULL && uMsg != WM_INITDIALOG)
132 {
133 goto HandleDefaultMessage;
134 }
135
136 switch (uMsg)
137 {
138 case WM_INITDIALOG:
139 OnCreateTaskbarPage(hwndDlg, (PPROPSHEET_INFO)lParam);
140 break;
141
142 case WM_COMMAND:
143 switch(LOWORD(wParam))
144 {
145 case IDC_TASKBARPROP_LOCK:
146 case IDC_TASKBARPROP_HIDE:
147 case IDC_TASKBARPROP_GROUP:
148 case IDC_TASKBARPROP_SHOWQL:
149 if (HIWORD(wParam) == BN_CLICKED)
150 {
151 UpdateTaskbarBitmap(pPropInfo);
152
153 /* Enable the 'Apply' button */
154 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
155 }
156 break;
157 }
158 break;
159
160 case WM_NOTIFY:
161 {
162 LPNMHDR pnmh = (LPNMHDR)lParam;
163
164 switch(pnmh->code)
165 {
166 case PSN_SETACTIVE:
167 break;
168
169 case PSN_APPLY:
170 break;
171 }
172
173 break;
174 }
175
176 case WM_DESTROY:
177 if (pPropInfo->hTaskbarBitmap)
178 {
179 DeleteObject(pPropInfo->hTaskbarBitmap);
180 }
181 break;
182
183 HandleDefaultMessage:
184 default:
185 return FALSE;
186 }
187
188 return FALSE;
189 }
190
191
192 INT_PTR CALLBACK
193 StartMenuPageProc(HWND hwndDlg,
194 UINT uMsg,
195 WPARAM wParam,
196 LPARAM lParam)
197 {
198 switch (uMsg)
199 {
200 case WM_INITDIALOG:
201 break;
202
203 case WM_DESTROY:
204 break;
205
206 case WM_NOTIFY:
207 {
208 LPNMHDR pnmh = (LPNMHDR)lParam;
209
210 switch(pnmh->code)
211 {
212 case PSN_SETACTIVE:
213 break;
214
215 case PSN_APPLY:
216 break;
217 }
218
219 break;
220 }
221 }
222
223 return FALSE;
224 }
225
226
227 INT_PTR CALLBACK
228 NotificationPageProc(HWND hwndDlg,
229 UINT uMsg,
230 WPARAM wParam,
231 LPARAM lParam)
232 {
233 switch (uMsg)
234 {
235 case WM_INITDIALOG:
236 break;
237
238 case WM_DESTROY:
239 break;
240
241 case WM_NOTIFY:
242 {
243 LPNMHDR pnmh = (LPNMHDR)lParam;
244
245 switch(pnmh->code)
246 {
247 case PSN_SETACTIVE:
248 break;
249
250 case PSN_APPLY:
251 break;
252 }
253
254 break;
255 }
256 }
257
258 return FALSE;
259 }
260
261
262 INT_PTR CALLBACK
263 ToolbarsPageProc(HWND hwndDlg,
264 UINT uMsg,
265 WPARAM wParam,
266 LPARAM lParam)
267 {
268 switch (uMsg)
269 {
270 case WM_INITDIALOG:
271 break;
272
273 case WM_DESTROY:
274 break;
275
276 case WM_NOTIFY:
277 {
278 LPNMHDR pnmh = (LPNMHDR)lParam;
279
280 switch(pnmh->code)
281 {
282 case PSN_SETACTIVE:
283 break;
284
285 case PSN_APPLY:
286 break;
287 }
288
289 break;
290 }
291 }
292
293 return FALSE;
294 }
295
296
297 static VOID
298 InitPropSheetPage(PROPSHEETPAGE *psp,
299 WORD idDlg,
300 DLGPROC DlgProc,
301 LPARAM lParam)
302 {
303 ZeroMemory(psp, sizeof(PROPSHEETPAGE));
304 psp->dwSize = sizeof(PROPSHEETPAGE);
305 psp->dwFlags = PSP_DEFAULT;
306 psp->hInstance = hExplorerInstance;
307 psp->pszTemplate = MAKEINTRESOURCE(idDlg);
308 psp->lParam = lParam;
309 psp->pfnDlgProc = DlgProc;
310 }
311
312
313 HWND
314 DisplayTrayProperties(ITrayWindow *Tray)
315 {
316 PPROPSHEET_INFO pPropInfo;
317 PROPSHEETHEADER psh;
318 PROPSHEETPAGE psp[4];
319 TCHAR szCaption[256];
320
321 pPropInfo = (PPROPSHEET_INFO)HeapAlloc(hProcessHeap,
322 HEAP_ZERO_MEMORY,
323 sizeof(PROPSHEET_INFO));
324 if (!pPropInfo)
325 {
326 return NULL;
327 }
328
329 if (!LoadString(hExplorerInstance,
330 IDS_TASKBAR_STARTMENU_PROP_CAPTION,
331 szCaption,
332 sizeof(szCaption) / sizeof(szCaption[0])))
333 {
334 return NULL;
335 }
336
337 ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
338 psh.dwSize = sizeof(PROPSHEETHEADER);
339 psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE;
340 psh.hwndParent = NULL;
341 psh.hInstance = hExplorerInstance;
342 psh.hIcon = NULL;
343 psh.pszCaption = szCaption;
344 psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
345 psh.nStartPage = 0;
346 psh.ppsp = psp;
347
348 InitPropSheetPage(&psp[0], IDD_TASKBARPROP_TASKBAR, (DLGPROC)TaskbarPageProc, (LPARAM)pPropInfo);
349 InitPropSheetPage(&psp[1], IDD_TASKBARPROP_STARTMENU, (DLGPROC)StartMenuPageProc, (LPARAM)pPropInfo);
350 InitPropSheetPage(&psp[2], IDD_TASKBARPROP_NOTIFICATION, (DLGPROC)NotificationPageProc, (LPARAM)pPropInfo);
351 InitPropSheetPage(&psp[3], IDD_TASKBARPROP_TOOLBARS, (DLGPROC)ToolbarsPageProc, (LPARAM)pPropInfo);
352
353 PropertySheet(&psh);
354
355 HeapFree(hProcessHeap,
356 0,
357 pPropInfo);
358
359 // FIXME: return the HWND
360 return NULL;
361 }