2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Display Control Panel
4 * FILE: dll/cpl/desk/appearance.c
5 * PURPOSE: Appearance property page
7 * PROGRAMMERS: Trevor McCort (lycan359@gmail.com)
8 * Timo Kreuzer (timo[dot]kreuzer[at]web[dot]de)
13 /******************************************************************************/
16 AppearancePage_UpdateThemePreview(HWND hwndDlg
, GLOBALS
*g
)
18 if (g
->ActiveTheme
.ThemeActive
)
22 GetClientRect(GetDlgItem(hwndDlg
, IDC_APPEARANCE_PREVIEW
), &rcWindow
);
23 if (DrawThemePreview(g
->hdcThemePreview
, &g
->Scheme
, &g
->ActiveTheme
, &rcWindow
))
25 SendDlgItemMessage(hwndDlg
, IDC_APPEARANCE_PREVIEW
, PVM_SET_HDC_PREVIEW
, 0, (LPARAM
)g
->hdcThemePreview
);
30 SendDlgItemMessage(hwndDlg
, IDC_APPEARANCE_PREVIEW
, PVM_UPDATETHEME
, 0, (LPARAM
)&g
->Scheme
);
31 SendDlgItemMessage(hwndDlg
, IDC_APPEARANCE_PREVIEW
, PVM_SET_HDC_PREVIEW
, 0, 0);
35 AppearancePage_LoadSelectedScheme(HWND hwndDlg
, GLOBALS
*g
)
37 if (g
->ActiveTheme
.ThemeActive
== FALSE
)
39 LoadSchemeFromReg(&g
->Scheme
, &g
->ActiveTheme
);
43 LoadSchemeFromTheme(&g
->Scheme
, &g
->ActiveTheme
);
46 g_GlobalData
.desktop_color
= g
->Scheme
.crColor
[COLOR_DESKTOP
];
50 AppearancePage_ShowStyles(HWND hwndDlg
, int nIDDlgItem
, PTHEME_STYLE pStyles
, PTHEME_STYLE pActiveStyle
)
53 HWND hwndList
= GetDlgItem(hwndDlg
, nIDDlgItem
);
54 PTHEME_STYLE pCurrentStyle
;
56 SendMessage(hwndList
, CB_RESETCONTENT
, 0, 0);
58 for (pCurrentStyle
= pStyles
;
60 pCurrentStyle
= pCurrentStyle
->NextStyle
)
62 iListIndex
= SendMessage(hwndList
, CB_ADDSTRING
, 0, (LPARAM
)pCurrentStyle
->DisplayName
);
63 SendMessage(hwndList
, CB_SETITEMDATA
, iListIndex
, (LPARAM
)pCurrentStyle
);
64 if (pCurrentStyle
== pActiveStyle
)
66 SendMessage(hwndList
, CB_SETCURSEL
, (WPARAM
)iListIndex
, 0);
72 AppearancePage_ShowColorSchemes(HWND hwndDlg
, GLOBALS
*g
)
74 AppearancePage_ShowStyles(hwndDlg
,
75 IDC_APPEARANCE_COLORSCHEME
,
76 g
->ActiveTheme
.Theme
->ColoursList
,
77 g
->ActiveTheme
.Color
);
81 AppearancePage_ShowSizes(HWND hwndDlg
, GLOBALS
*g
)
85 if (g
->ActiveTheme
.Theme
->SizesList
)
86 pSizes
= g
->ActiveTheme
.Theme
->SizesList
;
88 pSizes
= g
->ActiveTheme
.Color
->ChildStyle
;
90 AppearancePage_ShowStyles(hwndDlg
,
97 AppearancePage_OnInit(HWND hwndDlg
)
106 g
= (GLOBALS
*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(GLOBALS
));
110 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)g
);
112 g
->bInitializing
= TRUE
;
114 if (!LoadCurrentScheme(&g
->Scheme
))
117 g
->pThemes
= LoadThemes();
120 BOOL bLoadedTheme
= FALSE
;
122 if (g_GlobalData
.pwszAction
&&
123 g_GlobalData
.pwszFile
&&
124 wcscmp(g_GlobalData
.pwszAction
, L
"OpenMSTheme") == 0)
126 bLoadedTheme
= FindOrAppendTheme(g
->pThemes
,
127 g_GlobalData
.pwszFile
,
135 g
->bThemeChanged
= TRUE
;
136 g
->bSchemeChanged
= TRUE
;
138 PostMessageW(GetParent(hwndDlg
), PSM_CHANGED
, (WPARAM
)hwndDlg
, 0);
140 AppearancePage_LoadSelectedScheme(hwndDlg
, g
);
144 if (!GetActiveTheme(g
->pThemes
, &g
->ActiveTheme
))
146 g
->ActiveTheme
.ThemeActive
= FALSE
;
151 * Keep a copy of the selected classic theme in order to select this
152 * when user selects the classic theme (and not a horrible random theme )
154 if (!GetActiveClassicTheme(g
->pThemes
, &g
->ClassicTheme
))
156 g
->ClassicTheme
.Theme
= g
->pThemes
;
157 g
->ClassicTheme
.Color
= g
->pThemes
->ColoursList
;
158 g
->ClassicTheme
.Size
= g
->ClassicTheme
.Color
->ChildStyle
;
161 if (g
->ActiveTheme
.ThemeActive
== FALSE
)
162 g
->ActiveTheme
= g
->ClassicTheme
;
164 GetClientRect(GetDlgItem(hwndDlg
, IDC_APPEARANCE_PREVIEW
), &rcPreview
);
166 hdcScreen
= GetDC(NULL
);
167 g
->hbmpThemePreview
= CreateCompatibleBitmap(hdcScreen
, rcPreview
.right
, rcPreview
.bottom
);
168 g
->hdcThemePreview
= CreateCompatibleDC(hdcScreen
);
169 SelectObject(g
->hdcThemePreview
, g
->hbmpThemePreview
);
170 ReleaseDC(NULL
, hdcScreen
);
172 hwndTheme
= GetDlgItem(hwndDlg
, IDC_APPEARANCE_VISUAL_STYLE
);
174 for (pTheme
= g
->pThemes
; pTheme
; pTheme
= pTheme
->NextTheme
)
176 iListIndex
= SendMessage(hwndTheme
, CB_ADDSTRING
, 0, (LPARAM
)pTheme
->DisplayName
);
177 SendMessage(hwndTheme
, CB_SETITEMDATA
, iListIndex
, (LPARAM
)pTheme
);
178 if (pTheme
== g
->ActiveTheme
.Theme
)
180 SendMessage(hwndTheme
, CB_SETCURSEL
, (WPARAM
)iListIndex
, 0);
184 if (g
->ActiveTheme
.Theme
)
186 AppearancePage_ShowColorSchemes(hwndDlg
, g
);
187 AppearancePage_ShowSizes(hwndDlg
, g
);
188 AppearancePage_UpdateThemePreview(hwndDlg
, g
);
191 g
->bInitializing
= FALSE
;
197 AppearancePage_OnDestroy(HWND hwndDlg
, GLOBALS
*g
)
199 HeapFree(GetProcessHeap(), 0, g
);
203 GetSelectedData(HWND hwndDlg
, int nIDDlgItem
)
208 hwndCombo
= GetDlgItem(hwndDlg
, nIDDlgItem
);
209 sel
= SendMessage(hwndCombo
, CB_GETCURSEL
, 0, 0);
212 return (PVOID
)SendMessage(hwndCombo
, CB_GETITEMDATA
, (WPARAM
)sel
, 0);
216 AppearancePageProc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
221 g
= (GLOBALS
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
226 return AppearancePage_OnInit(hwndDlg
);
229 AppearancePage_OnDestroy(hwndDlg
, g
);
233 if (g
== NULL
|| g
->bInitializing
)
236 switch (LOWORD(wParam
))
238 case IDC_APPEARANCE_EFFECTS
:
239 if (DialogBoxParam(hApplet
, MAKEINTRESOURCE(IDD_EFFAPPEARANCE
),
240 hwndDlg
, EffAppearanceDlgProc
, (LPARAM
)g
) == IDOK
)
242 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
243 g
->Scheme
= g
->SchemeAdv
;
244 g
->bSchemeChanged
= TRUE
;
248 case IDC_APPEARANCE_ADVANCED
:
249 if (DialogBoxParam(hApplet
, MAKEINTRESOURCE(IDD_ADVAPPEARANCE
),
250 hwndDlg
, AdvAppearanceDlgProc
, (LPARAM
)g
) == IDOK
)
252 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
253 g
->bSchemeChanged
= TRUE
;
254 g
->Scheme
= g
->SchemeAdv
;
255 g_GlobalData
.desktop_color
= g
->Scheme
.crColor
[COLOR_DESKTOP
];
257 AppearancePage_UpdateThemePreview(hwndDlg
, g
);
261 case IDC_APPEARANCE_COLORSCHEME
:
262 if (HIWORD(wParam
) == CBN_SELCHANGE
)
264 g
->ActiveTheme
.Color
= (PTHEME_STYLE
)GetSelectedData(hwndDlg
, IDC_APPEARANCE_COLORSCHEME
);
265 if (g
->ActiveTheme
.Color
->ChildStyle
!= NULL
)
266 g
->ActiveTheme
.Size
= g
->ActiveTheme
.Color
->ChildStyle
;
268 g
->bSchemeChanged
= TRUE
;
269 if (g
->ActiveTheme
.ThemeActive
)
270 g
->bThemeChanged
= TRUE
;
272 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
274 AppearancePage_LoadSelectedScheme(hwndDlg
, g
);
275 AppearancePage_ShowSizes(hwndDlg
, g
);
276 AppearancePage_UpdateThemePreview(hwndDlg
, g
);
280 case IDC_APPEARANCE_VISUAL_STYLE
:
281 if (HIWORD(wParam
) == CBN_SELCHANGE
)
283 PTHEME pTheme
= (PTHEME
)GetSelectedData(hwndDlg
, IDC_APPEARANCE_VISUAL_STYLE
);
285 if (g
->ClassicTheme
.Theme
== pTheme
)
286 g
->ActiveTheme
= g
->ClassicTheme
;
289 g
->ActiveTheme
.Theme
= pTheme
;
290 g
->ActiveTheme
.Size
= pTheme
->SizesList
;
291 g
->ActiveTheme
.Color
= pTheme
->ColoursList
;
292 g
->ActiveTheme
.ThemeActive
= TRUE
;
295 g
->bThemeChanged
= TRUE
;
296 g
->bSchemeChanged
= TRUE
;
298 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
300 AppearancePage_ShowColorSchemes(hwndDlg
, g
);
301 AppearancePage_ShowSizes(hwndDlg
, g
);
302 AppearancePage_LoadSelectedScheme(hwndDlg
, g
);
303 AppearancePage_UpdateThemePreview(hwndDlg
, g
);
307 case IDC_APPEARANCE_SIZE
:
308 if (HIWORD(wParam
) == CBN_SELCHANGE
)
310 g
->ActiveTheme
.Size
= (PTHEME_STYLE
)GetSelectedData(hwndDlg
, IDC_APPEARANCE_SIZE
);
311 g
->bSchemeChanged
= TRUE
;
312 if (g
->ActiveTheme
.ThemeActive
)
313 g
->bThemeChanged
= TRUE
;
315 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
317 AppearancePage_LoadSelectedScheme(hwndDlg
, g
);
318 AppearancePage_UpdateThemePreview(hwndDlg
, g
);
324 lpnm
= (LPNMHDR
)lParam
;
329 if (g
->bThemeChanged
)
331 ActivateTheme(&g
->ActiveTheme
);
334 if (g
->bSchemeChanged
)
336 ApplyScheme(&g
->Scheme
, &g
->ActiveTheme
);
337 if (g
->ActiveTheme
.ThemeActive
== FALSE
)
338 g
->ClassicTheme
= g
->ActiveTheme
;
341 AppearancePage_UpdateThemePreview(hwndDlg
, g
);
342 g
->bThemeChanged
= FALSE
;
343 g
->bSchemeChanged
= FALSE
;
344 SetWindowLongPtr(hwndDlg
, DWLP_MSGRESULT
, (LONG_PTR
)PSNRET_NOERROR
);
348 SetWindowLongPtr(hwndDlg
, DWLP_MSGRESULT
, (LONG_PTR
)FALSE
);
352 if (g
->Scheme
.crColor
[COLOR_DESKTOP
] != g_GlobalData
.desktop_color
)
354 g
->Scheme
.crColor
[COLOR_DESKTOP
] = g_GlobalData
.desktop_color
;
355 AppearancePage_UpdateThemePreview(hwndDlg
, g
);