1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS Display Control Panel 4 * FILE: lib/cpl/desk/appearance.c 5 * PURPOSE: Appearance property page 6 * 7 * PROGRAMMERS: Trevor McCort (lycan359@gmail.com) 8 * Timo Kreuzer (timo[dot]kreuzer[at]web[dot]de) 9 */ 10 11 #include "desk.h" 12 #include "theme.h" 13 #include "preview.h" 14 #include "appearance.h" 15 16 /******************************************************************************/ 17 18 static INT_PTR 19 AppearancePage_OnInit(HWND hwndDlg) 20 { 21 TCHAR strSelectedStyle[4]; 22 INT i, TemplateCount, iListIndex; 23 HWND hwndCombo; 24 GLOBALS *g; 25 26 g = (GLOBALS*)LocalAlloc(LPTR, sizeof(GLOBALS)); 27 if (g == NULL) 28 return FALSE; 29 30 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)g); 31 32 LoadCurrentTheme(&g->Theme); 33 g->ThemeAdv = g->Theme; 34 g->bHasChanged = FALSE; 35 g->hBoldFont = g->hItalicFont = NULL; 36 g->hbmpColor[0] = g->hbmpColor[1] = g->hbmpColor[2] = NULL; 37 g->bInitializing = FALSE; 38 39 TemplateCount = LoadThemePresetEntries(strSelectedStyle); 40 41 hwndCombo = GetDlgItem(hwndDlg, IDC_APPEARANCE_COLORSCHEME); 42 g->ThemeId = -1; 43 g->bInitializing = TRUE; 44 for(i = 0; i < TemplateCount; i++) 45 { 46 iListIndex = SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM)g_ThemeTemplates[i].strLegacyName); 47 SendMessage(hwndCombo, CB_SETITEMDATA, iListIndex, i); 48 if (lstrcmp(g_ThemeTemplates[i].strKeyName, strSelectedStyle) == 0) 49 { 50 g->ThemeId = i; 51 SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM)iListIndex, 0); 52 } 53 } 54 g->bInitializing = FALSE; 55 56 return FALSE; 57 } 58 59 static VOID 60 AppearancePage_OnDestroy(HWND hwndDlg, GLOBALS *g) 61 { 62 LocalFree(g); 63 } 64 65 static INT 66 GetSelectedThemeId(HWND hwndDlg) 67 { 68 HWND hwndCombo; 69 INT sel; 70 71 hwndCombo = GetDlgItem(hwndDlg, IDC_APPEARANCE_COLORSCHEME); 72 sel = SendMessage(hwndCombo, CB_GETCURSEL, 0, 0); 73 if (sel == CB_ERR) 74 return -1; 75 return (INT)SendMessage(hwndCombo, CB_GETITEMDATA, (WPARAM)sel, 0); 76 } 77 78 INT_PTR CALLBACK 79 AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 80 { 81 GLOBALS *g; 82 LPNMHDR lpnm; 83 84 g = (GLOBALS*)GetWindowLongPtr(hwndDlg, DWLP_USER); 85 86 switch (uMsg) 87 { 88 case WM_INITDIALOG: 89 return AppearancePage_OnInit(hwndDlg); 90 91 case WM_DESTROY: 92 AppearancePage_OnDestroy(hwndDlg, g); 93 break; 94 95 case WM_COMMAND: 96 switch (LOWORD(wParam)) 97 { 98 case IDC_APPEARANCE_EFFECTS: 99 if (DialogBoxParam(hApplet, MAKEINTRESOURCE(IDD_EFFAPPEARANCE), 100 hwndDlg, EffAppearanceDlgProc, (LPARAM)g) == IDOK) 101 { 102 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 103 g->Theme = g->ThemeAdv; 104 g->bHasChanged = TRUE; 105 g->ThemeId = -1; /* Customized */ 106 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_SETCURSEL, (WPARAM)-1, 0); 107 SetDlgItemText(hwndDlg, IDC_APPEARANCE_COLORSCHEME, TEXT("")); 108 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme); 109 } 110 break; 111 112 case IDC_APPEARANCE_ADVANCED: 113 if (DialogBoxParam(hApplet, MAKEINTRESOURCE(IDD_ADVAPPEARANCE), 114 hwndDlg, AdvAppearanceDlgProc, (LPARAM)g) == IDOK) 115 { 116 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 117 g->Theme = g->ThemeAdv; 118 g_GlobalData.desktop_color = g->Theme.crColor[COLOR_DESKTOP]; 119 g->bHasChanged = TRUE; 120 g->ThemeId = -1; /* Customized */ 121 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_SETCURSEL, (WPARAM)-1, 0); 122 SetDlgItemText(hwndDlg, IDC_APPEARANCE_COLORSCHEME, TEXT("")); 123 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme); 124 } 125 break; 126 127 case IDC_APPEARANCE_COLORSCHEME: 128 if (HIWORD(wParam) == CBN_SELCHANGE && !g->bInitializing) 129 { 130 THEME Theme; 131 INT ThemeId = GetSelectedThemeId(hwndDlg); 132 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 133 g->bHasChanged = TRUE; 134 if (ThemeId != -1 && LoadThemeFromReg(&Theme, ThemeId)) 135 { 136 g->Theme = Theme; 137 g->ThemeId = ThemeId; 138 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&Theme); 139 } 140 } 141 break; 142 } 143 break; 144 145 case WM_NOTIFY: 146 lpnm = (LPNMHDR)lParam; 147 switch (lpnm->code) 148 { 149 case PSN_APPLY: 150 if (g->bHasChanged) 151 { 152 INT ThemeId = GetSelectedThemeId(hwndDlg); 153 ApplyTheme(&g->Theme, ThemeId); 154 g->ThemeId = ThemeId; 155 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme); 156 g->bHasChanged = FALSE; 157 } 158 SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LONG_PTR)PSNRET_NOERROR); 159 return TRUE; 160 161 case PSN_KILLACTIVE: 162 SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LONG_PTR)FALSE); 163 return TRUE; 164 165 case PSN_SETACTIVE: 166 if (g->Theme.crColor[COLOR_DESKTOP] != g_GlobalData.desktop_color) 167 { 168 g->Theme.crColor[COLOR_DESKTOP] = g_GlobalData.desktop_color; 169 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme); 170 } 171 break; 172 } 173 break; 174 } 175 176 return FALSE; 177 } 178