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 if (!GetActiveTheme(g
->pThemes
, &g
->ActiveTheme
))
121 g
->ActiveTheme
.ThemeActive
= FALSE
;
124 * Keep a copy of the selected classic theme in order to select this
125 * when user selects the classic theme (and not a horrible random theme )
127 if (!GetActiveClassicTheme(g
->pThemes
, &g
->ClassicTheme
))
129 g
->ClassicTheme
.Theme
= g
->pThemes
;
130 g
->ClassicTheme
.Color
= g
->pThemes
->ColoursList
;
131 g
->ClassicTheme
.Size
= g
->ClassicTheme
.Color
->ChildStyle
;
134 if (g
->ActiveTheme
.ThemeActive
== FALSE
)
135 g
->ActiveTheme
= g
->ClassicTheme
;
137 GetClientRect(GetDlgItem(hwndDlg
, IDC_APPEARANCE_PREVIEW
), &rcPreview
);
139 hdcScreen
= GetDC(NULL
);
140 g
->hbmpThemePreview
= CreateCompatibleBitmap(hdcScreen
, rcPreview
.right
, rcPreview
.bottom
);
141 g
->hdcThemePreview
= CreateCompatibleDC(hdcScreen
);
142 SelectObject(g
->hdcThemePreview
, g
->hbmpThemePreview
);
143 ReleaseDC(NULL
, hdcScreen
);
145 hwndTheme
= GetDlgItem(hwndDlg
, IDC_APPEARANCE_VISUAL_STYLE
);
147 for (pTheme
= g
->pThemes
; pTheme
; pTheme
= pTheme
->NextTheme
)
149 iListIndex
= SendMessage(hwndTheme
, CB_ADDSTRING
, 0, (LPARAM
)pTheme
->DisplayName
);
150 SendMessage(hwndTheme
, CB_SETITEMDATA
, iListIndex
, (LPARAM
)pTheme
);
151 if (pTheme
== g
->ActiveTheme
.Theme
)
153 SendMessage(hwndTheme
, CB_SETCURSEL
, (WPARAM
)iListIndex
, 0);
157 if (g
->ActiveTheme
.Theme
)
159 AppearancePage_ShowColorSchemes(hwndDlg
, g
);
160 AppearancePage_ShowSizes(hwndDlg
, g
);
161 AppearancePage_UpdateThemePreview(hwndDlg
, g
);
164 g
->bInitializing
= FALSE
;
170 AppearancePage_OnDestroy(HWND hwndDlg
, GLOBALS
*g
)
172 HeapFree(GetProcessHeap(), 0, g
);
176 GetSelectedData(HWND hwndDlg
, int nIDDlgItem
)
181 hwndCombo
= GetDlgItem(hwndDlg
, nIDDlgItem
);
182 sel
= SendMessage(hwndCombo
, CB_GETCURSEL
, 0, 0);
185 return (PVOID
)SendMessage(hwndCombo
, CB_GETITEMDATA
, (WPARAM
)sel
, 0);
189 AppearancePageProc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
194 g
= (GLOBALS
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
199 return AppearancePage_OnInit(hwndDlg
);
202 AppearancePage_OnDestroy(hwndDlg
, g
);
206 if(g
== NULL
|| g
->bInitializing
)
209 switch (LOWORD(wParam
))
211 case IDC_APPEARANCE_EFFECTS
:
212 if (DialogBoxParam(hApplet
, MAKEINTRESOURCE(IDD_EFFAPPEARANCE
),
213 hwndDlg
, EffAppearanceDlgProc
, (LPARAM
)g
) == IDOK
)
215 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
216 g
->Scheme
= g
->SchemeAdv
;
217 g
->bSchemeChanged
= TRUE
;
221 case IDC_APPEARANCE_ADVANCED
:
222 if (DialogBoxParam(hApplet
, MAKEINTRESOURCE(IDD_ADVAPPEARANCE
),
223 hwndDlg
, AdvAppearanceDlgProc
, (LPARAM
)g
) == IDOK
)
225 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
226 g
->bSchemeChanged
= TRUE
;
227 g
->Scheme
= g
->SchemeAdv
;
228 g_GlobalData
.desktop_color
= g
->Scheme
.crColor
[COLOR_DESKTOP
];
230 AppearancePage_UpdateThemePreview(hwndDlg
, g
);
234 case IDC_APPEARANCE_COLORSCHEME
:
235 if (HIWORD(wParam
) == CBN_SELCHANGE
)
237 g
->ActiveTheme
.Color
= (PTHEME_STYLE
)GetSelectedData(hwndDlg
, IDC_APPEARANCE_COLORSCHEME
);
238 if (g
->ActiveTheme
.Color
->ChildStyle
!= NULL
)
239 g
->ActiveTheme
.Size
= g
->ActiveTheme
.Color
->ChildStyle
;
241 g
->bSchemeChanged
= TRUE
;
242 if (g
->ActiveTheme
.ThemeActive
)
243 g
->bThemeChanged
= TRUE
;
245 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
247 AppearancePage_LoadSelectedScheme(hwndDlg
, g
);
248 AppearancePage_ShowSizes(hwndDlg
, g
);
249 AppearancePage_UpdateThemePreview(hwndDlg
, g
);
253 case IDC_APPEARANCE_VISUAL_STYLE
:
254 if (HIWORD(wParam
) == CBN_SELCHANGE
)
256 PTHEME pTheme
= (PTHEME
)GetSelectedData(hwndDlg
, IDC_APPEARANCE_VISUAL_STYLE
);
258 if (g
->ClassicTheme
.Theme
== pTheme
)
259 g
->ActiveTheme
= g
->ClassicTheme
;
262 g
->ActiveTheme
.Theme
= pTheme
;
263 g
->ActiveTheme
.Size
= pTheme
->SizesList
;
264 g
->ActiveTheme
.Color
= pTheme
->ColoursList
;
265 g
->ActiveTheme
.ThemeActive
= TRUE
;
268 g
->bThemeChanged
= TRUE
;
269 g
->bSchemeChanged
= TRUE
;
271 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
273 AppearancePage_ShowColorSchemes(hwndDlg
, g
);
274 AppearancePage_ShowSizes(hwndDlg
, g
);
275 AppearancePage_LoadSelectedScheme(hwndDlg
, g
);
276 AppearancePage_UpdateThemePreview(hwndDlg
, g
);
280 case IDC_APPEARANCE_SIZE
:
281 if (HIWORD(wParam
) == CBN_SELCHANGE
)
283 g
->ActiveTheme
.Size
= (PTHEME_STYLE
)GetSelectedData(hwndDlg
, IDC_APPEARANCE_SIZE
);
284 g
->bSchemeChanged
= TRUE
;
285 if(g
->ActiveTheme
.ThemeActive
)
286 g
->bThemeChanged
= TRUE
;
288 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
290 AppearancePage_LoadSelectedScheme(hwndDlg
, g
);
291 AppearancePage_UpdateThemePreview(hwndDlg
, g
);
297 lpnm
= (LPNMHDR
)lParam
;
302 if (g
->bThemeChanged
)
304 ActivateTheme(&g
->ActiveTheme
);
307 if (g
->bSchemeChanged
)
309 ApplyScheme(&g
->Scheme
, &g
->ActiveTheme
);
310 if (g
->ActiveTheme
.ThemeActive
== FALSE
)
311 g
->ClassicTheme
= g
->ActiveTheme
;
314 AppearancePage_UpdateThemePreview(hwndDlg
, g
);
315 g
->bThemeChanged
= FALSE
;
316 g
->bSchemeChanged
= FALSE
;
317 SetWindowLongPtr(hwndDlg
, DWLP_MSGRESULT
, (LONG_PTR
)PSNRET_NOERROR
);
321 SetWindowLongPtr(hwndDlg
, DWLP_MSGRESULT
, (LONG_PTR
)FALSE
);
325 if (g
->Scheme
.crColor
[COLOR_DESKTOP
] != g_GlobalData
.desktop_color
)
327 g
->Scheme
.crColor
[COLOR_DESKTOP
] = g_GlobalData
.desktop_color
;
328 AppearancePage_UpdateThemePreview(hwndDlg
, g
);