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