6b4d1a57a4ed6dc26e507d58e9bce2cbe8f363ff
[reactos.git] / dll / cpl / desk / effappdlg.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Display Control Panel
4 * FILE: dll/cpl/desk/effappdlg.c
5 * PURPOSE: Effects appearance dialog
6 *
7 * PROGRAMMERS: Jan Roeloffzen (jroeloffzen[at]hotmail[dot]com)
8 * Ismael Ferreras Morezuelas (swyterzone+reactos@gmail.com)
9 */
10
11 #include "desk.h"
12
13 /* Update all the controls with the current values for the selected screen element */
14 static VOID
15 UpdateControls(HWND hwndDlg, GLOBALS *g)
16 {
17 WPARAM state;
18
19 #define SAVE_CHECKBOX(__CONTROL_ID, __MEMBER) \
20 do { \
21 state = SendDlgItemMessageW(hwndDlg, __CONTROL_ID, BM_GETCHECK, 0, 0); \
22 g->SchemeAdv.Effects.__MEMBER = /* Do a XOR of both the conditions */ \
23 ((state == BST_CHECKED) != (__CONTROL_ID == IDC_EFFAPPEARANCE_KEYBOARDCUES)); \
24 } while(0)
25
26 #define RSET_COMBOBOX(__CONTROL_ID, __PARENT_MEMBER, __MEMBER) \
27 do { \
28 SendDlgItemMessageW(hwndDlg, __CONTROL_ID, CB_SETCURSEL, (WPARAM)g->SchemeAdv.Effects.__MEMBER, 0); \
29 EnableWindow(GetDlgItem(hwndDlg, __CONTROL_ID), g->SchemeAdv.Effects.__PARENT_MEMBER); \
30 } while(0)
31
32 /* Animated menu transitions section (checkbox + combo) */
33 SAVE_CHECKBOX(IDC_EFFAPPEARANCE_ANIMATION, bMenuAnimation);
34 RSET_COMBOBOX(IDC_EFFAPPEARANCE_ANIMATIONTYPE, bMenuAnimation, bMenuFade);
35
36 /* Font antialiasing section (checkbox + combo) */
37 SAVE_CHECKBOX(IDC_EFFAPPEARANCE_SMOOTHING, bFontSmoothing);
38 RSET_COMBOBOX(IDC_EFFAPPEARANCE_SMOOTHINGTYPE, bFontSmoothing, uiFontSmoothingType - 1);
39
40 /* Other checkboxes */
41 SAVE_CHECKBOX(IDC_EFFAPPEARANCE_SETDROPSHADOW, bDropShadow);
42 SAVE_CHECKBOX(IDC_EFFAPPEARANCE_DRAGFULLWINDOWS, bDragFullWindows);
43 SAVE_CHECKBOX(IDC_EFFAPPEARANCE_KEYBOARDCUES, bKeyboardCues);
44
45 #undef SAVE_CHECKBOX
46 #undef RSET_COMBOBOX
47
48 g->bSchemeChanged = TRUE;
49 }
50
51 static VOID
52 SaveCurrentValues(HWND hwndDlg, GLOBALS *g)
53 {
54 /* The settings get saved at the end of ApplyScheme() in theme.c,
55 * when clicking Apply in the main dialog. */
56 }
57
58 static VOID
59 AddToCombobox(INT Combo, HWND hwndDlg, INT From, INT To)
60 {
61 INT iElement;
62 TCHAR tstrText[80];
63
64 for (iElement = From; iElement <= To; iElement++)
65 {
66 LoadString(hApplet, iElement, (LPTSTR)tstrText, ARRAYSIZE(tstrText));
67 SendDlgItemMessage(hwndDlg, Combo, CB_ADDSTRING, 0, (LPARAM)tstrText);
68 }
69 }
70
71 /* Initialize the effects appearance dialog from the scheme populated in LoadCurrentScheme(), in theme.c */
72 static VOID
73 EffAppearanceDlg_Init(HWND hwndDlg, GLOBALS *g)
74 {
75 WPARAM state;
76
77 /* Copy the current theme values */
78 g->SchemeAdv = g->Scheme;
79
80 #define INIT_CHECKBOX(__CONTROL_ID, __MEMBER) \
81 do { \
82 state = /* Do a XOR of both the conditions */ \
83 ((g->SchemeAdv.Effects.__MEMBER) != (__CONTROL_ID == IDC_EFFAPPEARANCE_KEYBOARDCUES)) \
84 ? BST_CHECKED : BST_UNCHECKED; \
85 SendDlgItemMessageW(hwndDlg, __CONTROL_ID, BM_SETCHECK, state, 0); \
86 } while(0)
87
88 #define FILL_COMBOBOX(__CONTROL_ID, __FIRST_STR, __LAST_STR) \
89 AddToCombobox(__CONTROL_ID, hwndDlg, __FIRST_STR, __LAST_STR)
90
91 /* Animated menu transitions section (checkbox + combo) */
92 INIT_CHECKBOX(IDC_EFFAPPEARANCE_ANIMATION, bMenuAnimation);
93 FILL_COMBOBOX(IDC_EFFAPPEARANCE_ANIMATIONTYPE, IDS_SLIDEEFFECT,
94 IDS_FADEEFFECT);
95
96 /* Font antialiasing section (checkbox + combo) */
97 INIT_CHECKBOX(IDC_EFFAPPEARANCE_SMOOTHING, bFontSmoothing);
98 FILL_COMBOBOX(IDC_EFFAPPEARANCE_SMOOTHINGTYPE, IDS_STANDARDEFFECT,
99 IDS_CLEARTYPEEFFECT);
100
101 /* Other checkboxes */
102 INIT_CHECKBOX(IDC_EFFAPPEARANCE_SETDROPSHADOW, bDropShadow);
103 INIT_CHECKBOX(IDC_EFFAPPEARANCE_DRAGFULLWINDOWS, bDragFullWindows);
104 INIT_CHECKBOX(IDC_EFFAPPEARANCE_KEYBOARDCUES, bKeyboardCues);
105
106 #undef INIT_CHECKBOX
107 #undef FILL_COMBOBOX
108
109 /* Update the controls */
110 UpdateControls(hwndDlg, g);
111 }
112
113 INT_PTR CALLBACK
114 EffAppearanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
115 {
116 GLOBALS* g;
117
118 g = (GLOBALS*)GetWindowLongPtr(hwndDlg, DWLP_USER);
119
120 switch (uMsg)
121 {
122 case WM_INITDIALOG:
123 g = (GLOBALS*)lParam;
124 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)g);
125 EffAppearanceDlg_Init(hwndDlg, g);
126 break;
127
128 case WM_DESTROY:
129 break;
130
131 case WM_COMMAND:
132 switch(LOWORD(wParam))
133 {
134 case IDOK:
135 SaveCurrentValues(hwndDlg, g);
136 EndDialog(hwndDlg, IDOK);
137 break;
138
139 case IDCANCEL:
140 g->SchemeAdv = g->Scheme;
141 EndDialog(hwndDlg, IDCANCEL);
142 break;
143
144 case IDC_EFFAPPEARANCE_ANIMATION:
145 case IDC_EFFAPPEARANCE_SMOOTHING:
146 case IDC_EFFAPPEARANCE_SETDROPSHADOW:
147 case IDC_EFFAPPEARANCE_DRAGFULLWINDOWS:
148 case IDC_EFFAPPEARANCE_KEYBOARDCUES:
149 if (HIWORD(wParam) == BN_CLICKED)
150 {
151 UpdateControls(hwndDlg, g);
152 }
153 break;
154
155 case IDC_EFFAPPEARANCE_ANIMATIONTYPE:
156 case IDC_EFFAPPEARANCE_SMOOTHINGTYPE:
157 if (HIWORD(wParam) == CBN_SELCHANGE)
158 {
159 INT Index =
160 SendDlgItemMessageW(hwndDlg, IDC_EFFAPPEARANCE_SMOOTHINGTYPE,
161 CB_GETCURSEL, 0, 0);
162
163 g->SchemeAdv.Effects.bMenuFade =
164 SendDlgItemMessageW(hwndDlg, IDC_EFFAPPEARANCE_ANIMATIONTYPE,
165 CB_GETCURSEL, 0, 0);
166 g->SchemeAdv.Effects.uiFontSmoothingType = (Index == CB_ERR) ? 0 : (Index + 1);
167
168 UpdateControls(hwndDlg, g);
169 }
170 break;
171
172 default:
173 return FALSE;
174 }
175 break;
176
177 default:
178 return FALSE;
179 }
180
181 return TRUE;
182 }