[WINE]
[reactos.git] / dll / cpl / desk / appearance.c
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 // Effects dialog doesn't change the color scheme, therefore the following lines are commented out, until fixed finally
106 //g->ThemeId = -1; /* Customized */
107 //SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_SETCURSEL, (WPARAM)-1, 0);
108 //SetDlgItemText(hwndDlg, IDC_APPEARANCE_COLORSCHEME, TEXT(""));
109 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme);
110 }
111 break;
112
113 case IDC_APPEARANCE_ADVANCED:
114 if (DialogBoxParam(hApplet, MAKEINTRESOURCE(IDD_ADVAPPEARANCE),
115 hwndDlg, AdvAppearanceDlgProc, (LPARAM)g) == IDOK)
116 {
117 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
118 g->Theme = g->ThemeAdv;
119 g_GlobalData.desktop_color = g->Theme.crColor[COLOR_DESKTOP];
120 g->bHasChanged = TRUE;
121 g->ThemeId = -1; /* Customized */
122 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_SETCURSEL, (WPARAM)-1, 0);
123 SetDlgItemText(hwndDlg, IDC_APPEARANCE_COLORSCHEME, TEXT(""));
124 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme);
125 }
126 break;
127
128 case IDC_APPEARANCE_COLORSCHEME:
129 if (HIWORD(wParam) == CBN_SELCHANGE && !g->bInitializing)
130 {
131 THEME Theme;
132 INT ThemeId = GetSelectedThemeId(hwndDlg);
133 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
134 g->bHasChanged = TRUE;
135 if (ThemeId != -1 && LoadThemeFromReg(&Theme, ThemeId))
136 {
137 g->Theme = Theme;
138 g->ThemeId = ThemeId;
139 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&Theme);
140 }
141 }
142 break;
143 }
144 break;
145
146 case WM_NOTIFY:
147 lpnm = (LPNMHDR)lParam;
148 switch (lpnm->code)
149 {
150 case PSN_APPLY:
151 if (g->bHasChanged)
152 {
153 INT ThemeId = GetSelectedThemeId(hwndDlg);
154 ApplyTheme(&g->Theme, ThemeId);
155 g->ThemeId = ThemeId;
156 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme);
157 g->bHasChanged = FALSE;
158 }
159 SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LONG_PTR)PSNRET_NOERROR);
160 return TRUE;
161
162 case PSN_KILLACTIVE:
163 SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LONG_PTR)FALSE);
164 return TRUE;
165
166 case PSN_SETACTIVE:
167 if (g->Theme.crColor[COLOR_DESKTOP] != g_GlobalData.desktop_color)
168 {
169 g->Theme.crColor[COLOR_DESKTOP] = g_GlobalData.desktop_color;
170 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme);
171 }
172 break;
173 }
174 break;
175 }
176
177 return FALSE;
178 }