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