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
)
100 HWND hwndColor
, hwndTheme
;
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 hwndColor
= GetDlgItem(hwndDlg
, IDC_APPEARANCE_COLORSCHEME
);
146 hwndTheme
= GetDlgItem(hwndDlg
, IDC_APPEARANCE_VISUAL_STYLE
);
148 for (pTheme
= g
->pThemes
; pTheme
; pTheme
= pTheme
->NextTheme
)
150 iListIndex
= SendMessage(hwndTheme
, CB_ADDSTRING
, 0, (LPARAM
)pTheme
->DisplayName
);
151 SendMessage(hwndTheme
, CB_SETITEMDATA
, iListIndex
, (LPARAM
)pTheme
);
152 if (pTheme
== g
->ActiveTheme
.Theme
)
154 SendMessage(hwndTheme
, CB_SETCURSEL
, (WPARAM
)iListIndex
, 0);
158 if (g
->ActiveTheme
.Theme
)
160 AppearancePage_ShowColorSchemes(hwndDlg
, g
);
161 AppearancePage_ShowSizes(hwndDlg
, g
);
162 AppearancePage_UpdateThemePreview(hwndDlg
, g
);
165 g
->bInitializing
= FALSE
;
171 AppearancePage_OnDestroy(HWND hwndDlg
, GLOBALS
*g
)
173 HeapFree(GetProcessHeap(), 0, g
);
177 GetSelectedData(HWND hwndDlg
, int nIDDlgItem
)
182 hwndCombo
= GetDlgItem(hwndDlg
, nIDDlgItem
);
183 sel
= SendMessage(hwndCombo
, CB_GETCURSEL
, 0, 0);
186 return (PVOID
)SendMessage(hwndCombo
, CB_GETITEMDATA
, (WPARAM
)sel
, 0);
190 AppearancePageProc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
195 g
= (GLOBALS
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
200 return AppearancePage_OnInit(hwndDlg
);
203 AppearancePage_OnDestroy(hwndDlg
, g
);
207 if(g
== NULL
|| g
->bInitializing
)
210 switch (LOWORD(wParam
))
212 case IDC_APPEARANCE_EFFECTS
:
213 if (DialogBoxParam(hApplet
, MAKEINTRESOURCE(IDD_EFFAPPEARANCE
),
214 hwndDlg
, EffAppearanceDlgProc
, (LPARAM
)g
) == IDOK
)
216 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
217 g
->Scheme
= g
->SchemeAdv
;
218 g
->bSchemeChanged
= TRUE
;
222 case IDC_APPEARANCE_ADVANCED
:
223 if (DialogBoxParam(hApplet
, MAKEINTRESOURCE(IDD_ADVAPPEARANCE
),
224 hwndDlg
, AdvAppearanceDlgProc
, (LPARAM
)g
) == IDOK
)
226 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
227 g
->bSchemeChanged
= TRUE
;
228 g
->Scheme
= g
->SchemeAdv
;
229 g_GlobalData
.desktop_color
= g
->Scheme
.crColor
[COLOR_DESKTOP
];
231 AppearancePage_UpdateThemePreview(hwndDlg
, g
);
235 case IDC_APPEARANCE_COLORSCHEME
:
236 if (HIWORD(wParam
) == CBN_SELCHANGE
)
238 g
->ActiveTheme
.Color
= (PTHEME_STYLE
)GetSelectedData(hwndDlg
, IDC_APPEARANCE_COLORSCHEME
);
239 if (g
->ActiveTheme
.Color
->ChildStyle
!= NULL
)
240 g
->ActiveTheme
.Size
= g
->ActiveTheme
.Color
->ChildStyle
;
242 g
->bSchemeChanged
= TRUE
;
243 if (g
->ActiveTheme
.ThemeActive
)
244 g
->bThemeChanged
= TRUE
;
246 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
248 AppearancePage_LoadSelectedScheme(hwndDlg
, g
);
249 AppearancePage_ShowSizes(hwndDlg
, g
);
250 AppearancePage_UpdateThemePreview(hwndDlg
, g
);
254 case IDC_APPEARANCE_VISUAL_STYLE
:
255 if (HIWORD(wParam
) == CBN_SELCHANGE
)
257 PTHEME pTheme
= (PTHEME
)GetSelectedData(hwndDlg
, IDC_APPEARANCE_VISUAL_STYLE
);
259 if (g
->ClassicTheme
.Theme
== pTheme
)
260 g
->ActiveTheme
= g
->ClassicTheme
;
263 g
->ActiveTheme
.Theme
= pTheme
;
264 g
->ActiveTheme
.Size
= pTheme
->SizesList
;
265 g
->ActiveTheme
.Color
= pTheme
->ColoursList
;
266 g
->ActiveTheme
.ThemeActive
= TRUE
;
269 g
->bThemeChanged
= TRUE
;
270 g
->bSchemeChanged
= TRUE
;
272 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
274 AppearancePage_ShowColorSchemes(hwndDlg
, g
);
275 AppearancePage_ShowSizes(hwndDlg
, g
);
276 AppearancePage_LoadSelectedScheme(hwndDlg
, g
);
277 AppearancePage_UpdateThemePreview(hwndDlg
, g
);
281 case IDC_APPEARANCE_SIZE
:
282 if (HIWORD(wParam
) == CBN_SELCHANGE
)
284 g
->ActiveTheme
.Size
= (PTHEME_STYLE
)GetSelectedData(hwndDlg
, IDC_APPEARANCE_SIZE
);
285 g
->bSchemeChanged
= TRUE
;
286 if(g
->ActiveTheme
.ThemeActive
)
287 g
->bThemeChanged
= TRUE
;
289 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
291 AppearancePage_LoadSelectedScheme(hwndDlg
, g
);
292 AppearancePage_UpdateThemePreview(hwndDlg
, g
);
298 lpnm
= (LPNMHDR
)lParam
;
303 if (g
->bThemeChanged
)
305 ActivateTheme(&g
->ActiveTheme
);
308 if (g
->bSchemeChanged
)
310 ApplyScheme(&g
->Scheme
, &g
->ActiveTheme
);
311 if (g
->ActiveTheme
.ThemeActive
== FALSE
)
312 g
->ClassicTheme
= g
->ActiveTheme
;
315 AppearancePage_UpdateThemePreview(hwndDlg
, g
);
316 g
->bThemeChanged
= FALSE
;
317 g
->bSchemeChanged
= FALSE
;
318 SetWindowLongPtr(hwndDlg
, DWLP_MSGRESULT
, (LONG_PTR
)PSNRET_NOERROR
);
322 SetWindowLongPtr(hwndDlg
, DWLP_MSGRESULT
, (LONG_PTR
)FALSE
);
326 if (g
->Scheme
.crColor
[COLOR_DESKTOP
] != g_GlobalData
.desktop_color
)
328 g
->Scheme
.crColor
[COLOR_DESKTOP
] = g_GlobalData
.desktop_color
;
329 AppearancePage_UpdateThemePreview(hwndDlg
, g
);