Reactos
at master 391 lines 14 kB view raw
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 24static void SetBitmap(HWND hwnd, HBITMAP* hbmp, UINT uImageId) 25{ 26 if (*hbmp) 27 DeleteObject(*hbmp); 28 29 *hbmp = (HBITMAP)LoadImageW(hExplorerInstance, 30 MAKEINTRESOURCEW(uImageId), 31 IMAGE_BITMAP, 32 0, 33 0, 34 LR_DEFAULTCOLOR); 35 36 if (*hbmp && hwnd) 37 { 38 BITMAP bm; 39 GetObject(*hbmp, sizeof(bm), &bm); 40 ::SetWindowPos(hwnd, NULL, 0, 0, bm.bmWidth + 2, bm.bmHeight + 2, 41 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER); 42 SendMessage(hwnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)*hbmp); 43 } 44 45} 46 47class CTaskBarSettingsPage : public CPropertyPageImpl<CTaskBarSettingsPage> 48{ 49private: 50 HBITMAP m_hbmpTaskbar; 51 HWND m_hwndTaskbar; 52 53 void _UpdateDialog() 54 { 55 BOOL bLock = IsDlgButtonChecked(IDC_TASKBARPROP_LOCK); 56 BOOL bHide = IsDlgButtonChecked(IDC_TASKBARPROP_HIDE); 57 BOOL bGroup = IsDlgButtonChecked(IDC_TASKBARPROP_GROUP); 58 BOOL bShowQL = IsDlgButtonChecked(IDC_TASKBARPROP_SHOWQL); 59 UINT uImageId; 60 61 HWND hwndTaskbarBitmap = GetDlgItem(IDC_TASKBARPROP_TASKBARBITMAP); 62 63 if (bHide) 64 uImageId = IDB_TASKBARPROP_AUTOHIDE; 65 else if (bLock && bGroup && bShowQL) 66 uImageId = IDB_TASKBARPROP_LOCK_GROUP_QL; 67 else if (bLock && !bGroup && !bShowQL) 68 uImageId = IDB_TASKBARPROP_LOCK_NOGROUP_NOQL; 69 else if (bLock && bGroup && !bShowQL) 70 uImageId = IDB_TASKBARPROP_LOCK_GROUP_NOQL; 71 else if (bLock && !bGroup && bShowQL) 72 uImageId = IDB_TASKBARPROP_LOCK_NOGROUP_QL; 73 else if (!bLock && !bGroup && !bShowQL) 74 uImageId = IDB_TASKBARPROP_NOLOCK_NOGROUP_NOQL; 75 else if (!bLock && bGroup && !bShowQL) 76 uImageId = IDB_TASKBARPROP_NOLOCK_GROUP_NOQL; 77 else if (!bLock && !bGroup && bShowQL) 78 uImageId = IDB_TASKBARPROP_NOLOCK_NOGROUP_QL; 79 else if (!bLock && bGroup && bShowQL) 80 uImageId = IDB_TASKBARPROP_NOLOCK_GROUP_QL; 81 82 SetBitmap(hwndTaskbarBitmap, &m_hbmpTaskbar, uImageId); 83 } 84 85public: 86 enum { IDD = IDD_TASKBARPROP_TASKBAR }; 87 88 BEGIN_MSG_MAP(CTaskBarSettingsPage) 89 MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) 90 COMMAND_RANGE_HANDLER(IDC_TASKBARPROP_FIRST_CMD, IDC_TASKBARPROP_LAST_CMD, OnCtrlCommand) 91 CHAIN_MSG_MAP(CPropertyPageImpl<CTaskBarSettingsPage>) 92 END_MSG_MAP() 93 94 CTaskBarSettingsPage(HWND hwnd): 95 m_hbmpTaskbar(NULL), 96 m_hwndTaskbar(hwnd) 97 { 98 } 99 100 ~CTaskBarSettingsPage() 101 { 102 if (m_hbmpTaskbar) 103 DeleteObject(m_hbmpTaskbar); 104 } 105 106 LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 107 { 108 CheckDlgButton(IDC_TASKBARPROP_LOCK, g_TaskbarSettings.bLock ? BST_CHECKED : BST_UNCHECKED); 109 CheckDlgButton(IDC_TASKBARPROP_HIDE, g_TaskbarSettings.sr.AutoHide ? BST_CHECKED : BST_UNCHECKED); 110 CheckDlgButton(IDC_TASKBARPROP_ONTOP, g_TaskbarSettings.sr.AlwaysOnTop ? BST_CHECKED : BST_UNCHECKED); 111 CheckDlgButton(IDC_TASKBARPROP_GROUP, g_TaskbarSettings.bGroupButtons ? BST_CHECKED : BST_UNCHECKED); 112 //CheckDlgButton(IDC_TASKBARPROP_SHOWQL, g_TaskbarSettings.bShowQuickLaunch ? BST_CHECKED : BST_UNCHECKED); 113 CheckDlgButton(IDC_TASKBARPROP_SMALLICONS, g_TaskbarSettings.bSmallIcons ? BST_CHECKED : BST_UNCHECKED); 114 115 _UpdateDialog(); 116 return TRUE; 117 } 118 119 LRESULT OnCtrlCommand(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 120 { 121 _UpdateDialog(); 122 SetModified(TRUE); 123 return 0; 124 } 125 126 int OnApply() 127 { 128 TaskbarSettings newSettings = g_TaskbarSettings; 129 130 newSettings.bLock = IsDlgButtonChecked(IDC_TASKBARPROP_LOCK); 131 newSettings.sr.AutoHide = IsDlgButtonChecked(IDC_TASKBARPROP_HIDE); 132 newSettings.sr.AlwaysOnTop = IsDlgButtonChecked(IDC_TASKBARPROP_ONTOP); 133 newSettings.bGroupButtons = IsDlgButtonChecked(IDC_TASKBARPROP_GROUP); 134 //newSettings.bShowQuickLaunch = IsDlgButtonChecked(IDC_TASKBARPROP_SHOWQL); 135 newSettings.bSmallIcons = IsDlgButtonChecked(IDC_TASKBARPROP_SMALLICONS); 136 137 SendMessage(m_hwndTaskbar, TWM_SETTINGSCHANGED, 0, (LPARAM)&newSettings); 138 139 return PSNRET_NOERROR; 140 } 141}; 142 143class CStartMenuSettingsPage : public CPropertyPageImpl<CStartMenuSettingsPage> 144{ 145private: 146 HBITMAP m_hbmpStartBitmap; 147 148 void _UpdateDialog() 149 { 150 HWND hwndCustomizeClassic = GetDlgItem(IDC_TASKBARPROP_STARTMENUCLASSICCUST); 151 HWND hwndCustomizeModern = GetDlgItem(IDC_TASKBARPROP_STARTMENUCUST); 152 HWND hwndStartBitmap = GetDlgItem(IDC_TASKBARPROP_STARTMENU_BITMAP); 153 HWND hwndModernRadioBtn = GetDlgItem(IDC_TASKBARPROP_STARTMENU); 154 HWND hwndModernText = GetDlgItem(IDC_TASKBARPROP_STARTMENUMODERNTEXT); 155 BOOL policyNoSimpleStartMenu = SHRestricted(REST_NOSTARTPANEL) != 0; 156 BOOL bModern = FALSE; 157 158 /* If NoSimpleStartMenu, disable ability to use Modern Start Menu */ 159 if (policyNoSimpleStartMenu) 160 { 161 /* Switch to classic */ 162 CheckDlgButton(IDC_TASKBARPROP_STARTMENUCLASSIC, BST_CHECKED); 163 164 /* Disable radio button */ 165 ::EnableWindow(hwndModernRadioBtn, FALSE); 166 167 /* Hide controls related to modern menu */ 168 ::ShowWindow(hwndModernRadioBtn, SW_HIDE); 169 ::ShowWindow(hwndModernText, SW_HIDE); 170 ::ShowWindow(hwndCustomizeModern, SW_HIDE); 171 } 172 /* If no restrictions, then get bModern from dialog */ 173 else 174 { 175 bModern = IsDlgButtonChecked(IDC_TASKBARPROP_STARTMENU); 176 } 177 178 ::EnableWindow(hwndCustomizeModern, bModern); 179 ::EnableWindow(hwndCustomizeClassic, !bModern); 180 181 UINT uImageId = bModern ? IDB_STARTPREVIEW : IDB_STARTPREVIEW_CLASSIC; 182 SetBitmap(hwndStartBitmap, &m_hbmpStartBitmap, uImageId); 183 } 184 185public: 186 enum { IDD = IDD_TASKBARPROP_STARTMENU }; 187 188 BEGIN_MSG_MAP(CTaskBarSettingsPage) 189 MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) 190 COMMAND_ID_HANDLER(IDC_TASKBARPROP_STARTMENUCLASSICCUST, OnStartMenuCustomize) 191 CHAIN_MSG_MAP(CPropertyPageImpl<CStartMenuSettingsPage>) 192 END_MSG_MAP() 193 194 CStartMenuSettingsPage(): 195 m_hbmpStartBitmap(NULL) 196 { 197 } 198 199 ~CStartMenuSettingsPage() 200 { 201 if (m_hbmpStartBitmap) 202 DeleteObject(m_hbmpStartBitmap); 203 } 204 205 LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 206 { 207 BOOL modern = SHELL_GetSetting(SSF_STARTPANELON, fStartPanelOn); 208 CheckDlgButton(modern ? IDC_TASKBARPROP_STARTMENU : IDC_TASKBARPROP_STARTMENUCLASSIC, BST_CHECKED); 209 _UpdateDialog(); 210 return TRUE; 211 } 212 213 LRESULT OnStartMenuCustomize(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 214 { 215 ShowCustomizeClassic(hExplorerInstance, m_hWnd); 216 return 0; 217 } 218 219 int OnApply() 220 { 221 SHELLSTATE ss; 222 ss.fStartPanelOn = !IsDlgButtonChecked(IDC_TASKBARPROP_STARTMENUCLASSIC); 223 SHGetSetSettings(&ss, SSF_STARTPANELON, TRUE); 224 return PSNRET_NOERROR; 225 } 226}; 227 228class CNotifySettingsPage : public CPropertyPageImpl<CNotifySettingsPage> 229{ 230private: 231 HBITMAP m_hbmpTray; 232 HWND m_hwndTaskbar; 233 static const WORD wImageIdLookupTable[2][2][2][2]; 234 235 void _UpdateDialog() 236 { 237 BOOL bShowClock = IsDlgButtonChecked(IDC_TASKBARPROP_CLOCK); 238 BOOL bShowSeconds = IsDlgButtonChecked(IDC_TASKBARPROP_SECONDS); 239 BOOL bHideInactive = IsDlgButtonChecked(IDC_TASKBARPROP_HIDEICONS); 240 BOOL bShowDesktopButton = IsDlgButtonChecked(IDC_TASKBARPROP_DESKTOP); 241 242 HWND hwndCustomizeNotifyButton = GetDlgItem(IDC_TASKBARPROP_ICONCUST); 243 HWND hwndSeconds = GetDlgItem(IDC_TASKBARPROP_SECONDS); 244 HWND hwndTrayBitmap = GetDlgItem(IDC_TASKBARPROP_NOTIFICATIONBITMAP); 245 246 ::EnableWindow(hwndCustomizeNotifyButton, bHideInactive); 247 ::EnableWindow(hwndSeconds, bShowClock); 248 if (!bShowSeconds) 249 CheckDlgButton(IDC_TASKBARPROP_SECONDS, BST_UNCHECKED); 250 UINT uImageId = wImageIdLookupTable[bShowClock][bShowSeconds][bHideInactive][bShowDesktopButton]; 251 252 SetBitmap(hwndTrayBitmap, &m_hbmpTray, uImageId); 253 } 254 255public: 256 enum { IDD = IDD_TASKBARPROP_NOTIFY }; 257 258 BEGIN_MSG_MAP(CNotifySettingsPage) 259 MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) 260 COMMAND_ID_HANDLER(IDC_TASKBARPROP_ICONCUST, OnCustomizeTrayIcons) 261 COMMAND_RANGE_HANDLER(IDC_TASKBARPROP_NOTIFY_FIRST_CMD, IDC_TASKBARPROP_NOTIFY_LAST_CMD, OnCtrlCommand) 262 CHAIN_MSG_MAP(CPropertyPageImpl<CNotifySettingsPage>) 263 END_MSG_MAP() 264 265 CNotifySettingsPage(HWND hwnd): 266 m_hbmpTray(NULL), 267 m_hwndTaskbar(hwnd) 268 { 269 } 270 271 ~CNotifySettingsPage() 272 { 273 if (m_hbmpTray) 274 DeleteObject(m_hbmpTray); 275 } 276 277 LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 278 { 279 ::EnableWindow(GetDlgItem(IDC_TASKBARPROP_CLOCK), !SHRestricted(REST_HIDECLOCK)); 280 CheckDlgButton(IDC_TASKBARPROP_CLOCK, (!GetHideClock()) ? BST_CHECKED : BST_UNCHECKED); 281 CheckDlgButton(IDC_TASKBARPROP_SECONDS, g_TaskbarSettings.bShowSeconds ? BST_CHECKED : BST_UNCHECKED); 282 CheckDlgButton(IDC_TASKBARPROP_HIDEICONS, g_TaskbarSettings.bHideInactiveIcons ? BST_CHECKED : BST_UNCHECKED); 283 CheckDlgButton(IDC_TASKBARPROP_DESKTOP, g_TaskbarSettings.bShowDesktopButton ? BST_CHECKED : BST_UNCHECKED); 284 285 // TODO: bHideInactiveIcons is not implemented yet, just disable for now 286 CheckDlgButton(IDC_TASKBARPROP_HIDEICONS, BST_UNCHECKED); 287 ::EnableWindow(GetDlgItem(IDC_TASKBARPROP_HIDEICONS), FALSE); 288 289 _UpdateDialog(); 290 return TRUE; 291 } 292 293 LRESULT OnCustomizeTrayIcons(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 294 { 295 ShowCustomizeNotifyIcons(hExplorerInstance, m_hWnd); 296 return 0; 297 } 298 299 LRESULT OnCtrlCommand(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 300 { 301 _UpdateDialog(); 302 SetModified(TRUE); 303 return 0; 304 } 305 306 int OnApply() 307 { 308 TaskbarSettings newSettings = g_TaskbarSettings; 309 310 newSettings.sr.HideClock = !IsDlgButtonChecked(IDC_TASKBARPROP_CLOCK); 311 newSettings.bShowSeconds = IsDlgButtonChecked(IDC_TASKBARPROP_SECONDS); 312 newSettings.bHideInactiveIcons = IsDlgButtonChecked(IDC_TASKBARPROP_HIDEICONS); 313 newSettings.bShowDesktopButton = IsDlgButtonChecked(IDC_TASKBARPROP_DESKTOP); 314 315 SendMessage(m_hwndTaskbar, TWM_SETTINGSCHANGED, 0, (LPARAM)&newSettings); 316 317 return PSNRET_NOERROR; 318 } 319}; 320 321const WORD CNotifySettingsPage::wImageIdLookupTable[2][2][2][2] = 322{ 323 { 324 { 325 {IDB_SYSTRAYPROP_SHOW_NOCLOCK_NODESK, IDB_SYSTRAYPROP_SHOW_NOCLOCK_DESK}, 326 {IDB_SYSTRAYPROP_HIDE_NOCLOCK_NODESK, IDB_SYSTRAYPROP_HIDE_NOCLOCK_DESK} 327 }, 328 { 329 {IDB_SYSTRAYPROP_SHOW_NOCLOCK_NODESK, IDB_SYSTRAYPROP_SHOW_NOCLOCK_DESK}, 330 {IDB_SYSTRAYPROP_HIDE_NOCLOCK_NODESK, IDB_SYSTRAYPROP_HIDE_NOCLOCK_DESK} 331 } 332 }, 333 { 334 { 335 {IDB_SYSTRAYPROP_SHOW_CLOCK_NODESK, IDB_SYSTRAYPROP_SHOW_CLOCK_DESK}, 336 {IDB_SYSTRAYPROP_HIDE_CLOCK_NODESK, IDB_SYSTRAYPROP_HIDE_CLOCK_DESK} 337 }, 338 { 339 {IDB_SYSTRAYPROP_SHOW_SECONDS_NODESK, IDB_SYSTRAYPROP_SHOW_SECONDS_DESK}, 340 {IDB_SYSTRAYPROP_HIDE_SECONDS_NODESK, IDB_SYSTRAYPROP_HIDE_SECONDS_DESK} 341 } 342 } 343}; 344 345static int CALLBACK 346PropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam) 347{ 348 // NOTE: This callback is needed to set large icon correctly. 349 HICON hIcon; 350 switch (uMsg) 351 { 352 case PSCB_INITIALIZED: 353 { 354 hIcon = LoadIconW(hExplorerInstance, MAKEINTRESOURCEW(IDI_STARTMENU)); 355 SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon); 356 break; 357 } 358 } 359 return 0; 360} 361 362VOID 363DisplayTrayProperties(IN HWND hwndOwner, IN HWND hwndTaskbar) 364{ 365 PROPSHEETHEADER psh; 366 CSimpleArray<HPROPSHEETPAGE> hpsp; 367 CTaskBarSettingsPage tbSettingsPage(hwndTaskbar); 368 CStartMenuSettingsPage smSettingsPage; 369 CNotifySettingsPage naSettingsPage(hwndTaskbar); 370 CStringW caption; 371 372 caption.LoadStringW(IDS_TASKBAR_STARTMENU_PROP_CAPTION); 373 374 hpsp.Add(tbSettingsPage.Create()); 375 hpsp.Add(smSettingsPage.Create()); 376 hpsp.Add(naSettingsPage.Create()); 377 378 ZeroMemory(&psh, sizeof(psh)); 379 psh.dwSize = sizeof(psh); 380 psh.dwFlags = PSH_PROPTITLE | PSH_USEICONID | PSH_USECALLBACK; 381 psh.hwndParent = hwndOwner; 382 psh.hInstance = hExplorerInstance; 383 psh.pszIcon = MAKEINTRESOURCEW(IDI_STARTMENU); 384 psh.pszCaption = caption.GetString(); 385 psh.nPages = hpsp.GetSize(); 386 psh.nStartPage = 0; 387 psh.phpage = hpsp.GetData(); 388 psh.pfnCallback = PropSheetProc; 389 390 PropertySheet(&psh); 391}