xref: /reactos/dll/cpl/desk/advappdlg.c (revision 83bc98f9)
1 /*
2  * COPYRIGHT:       See COPYING in the top level directory
3  * PROJECT:         ReactOS Display Control Panel
4  * FILE:            dll/cpl/desk/advappdlg.c
5  * PURPOSE:         Advanced appearance dialog
6  *
7  * PROGRAMMER:      Timo Kreuzer (timo[dot]kreuzer[at]web[dot]de)
8  *
9  */
10 
11 #include "desk.h"
12 
13 /******************************************************************************/
14 
15 typedef struct
16 {
17     int Size;
18     int Size2;
19     int Color1;
20     int Color2;
21     int Font;
22     int FontColor;
23 } ASSIGNMENT;
24 
25 /* This const assigns the color and metric numbers to the elements from the elements list */
26 
27 /*   Size 1 (width)          Size 2 (height)     Color 1                  Color 2                         Font             Fontcolor */
28 const ASSIGNMENT g_Assignment[NUM_ELEMENTS] =
29 {
30     {-1,                     -1,                 COLOR_DESKTOP,           -1,                             -1,              -1},                 /* Desktop */
31     {SIZE_CAPTION_HEIGHT,    -1,                 COLOR_INACTIVECAPTION,   COLOR_GRADIENTINACTIVECAPTION,  FONT_CAPTION,    COLOR_INACTIVECAPTIONTEXT},/* inactive window caption */
32     {SIZE_BORDER_WIDTH,      -1,                 COLOR_INACTIVEBORDER,    -1,                             -1,              -1},                 /* inactive window border */
33     {SIZE_CAPTION_HEIGHT,    -1,                 COLOR_ACTIVECAPTION,     COLOR_GRADIENTACTIVECAPTION,    FONT_CAPTION,    COLOR_CAPTIONTEXT},  /* active window caption */
34     {SIZE_BORDER_WIDTH,      -1,                 COLOR_ACTIVEBORDER,      -1,                             -1,              -1},                 /* active window border */
35     {SIZE_MENU_HEIGHT,       SIZE_MENU_WIDTH,    COLOR_MENU,              COLOR_MENUHILIGHT,              FONT_MENU,       COLOR_MENUTEXT},     /* menu */
36     {SIZE_MENU_HEIGHT,       SIZE_MENU_WIDTH,    COLOR_HIGHLIGHT,         -1,                             -1,              COLOR_HIGHLIGHTTEXT},/* marked element */
37     {-1,                     -1,                 COLOR_WINDOW,            -1 /*COLOR_WINDOWFRAME*/,       -1,              COLOR_WINDOWTEXT},   /* window */
38     {SIZE_SCROLL_WIDTH,      SIZE_SCROLL_HEIGHT, COLOR_SCROLLBAR,         -1,                             -1,              -1},                 /* scroll bar */
39     {-1,                     -1,                 COLOR_3DFACE,            -1,                             -1,              COLOR_BTNTEXT},      /* 3d objects */
40     {SIZE_SM_CAPTION_HEIGHT, -1,                 -1,                      -1,                             FONT_SMCAPTION,  -1},                 /* palette (small) window caption */
41     {SIZE_CAPTION_HEIGHT,    -1,                 -1,                      -1,                             -1,              -1},                 /* caption bar buttons */
42     {-1,                     -1,                 -1,                      -1,                             FONT_MESSAGE,    COLOR_WINDOWTEXT},   /* dialog */
43     {-1,                     -1,                 COLOR_APPWORKSPACE,      -1,                             -1,              -1},                 /* application background */
44     {SIZE_ICON_SPACE_X,      -1,                 -1,                      -1,                             -1,              -1},                 /* icon distance horiz. */
45     {SIZE_ICON_SPACE_Y,      -1,                 -1,                      -1,                             -1,              -1},                 /* icon distance vert. */
46     {-1,                     -1,                 COLOR_INFOBK,            -1,                             FONT_STATUS,     COLOR_INFOTEXT},     /* quickinfo */
47     {SIZE_ICON,              -1,                 -1,                      -1,                             FONT_ICON,       -1},                 /* icon */
48 //  {-1,                     -1,                 -1,                      -1,                             -1,              COLOR_GRAYTEXT},     /* inactive menu item -- FIXME: Access? */
49 };
50 
51 /******************************************************************************/
52 
53 /* Draw the current color on the color picker buttons */
54 static VOID
UpdateButtonColor(HWND hwndDlg,GLOBALS * g,INT ID,INT nButton,INT nColor)55 UpdateButtonColor(HWND hwndDlg, GLOBALS* g, INT ID, INT nButton, INT nColor)
56 {
57     HDC hdcColorButton, hdcCompat;
58     RECT rect;
59     HBRUSH hbrush;
60     HWND hwndColorButton;
61     HGDIOBJ hgdiTmp;
62 
63     if (nColor != -1)
64     {
65         /* Create a DC to draw on */
66         hwndColorButton = GetDlgItem(hwndDlg, ID);
67         hdcColorButton = GetDC(hwndColorButton);
68         hdcCompat = CreateCompatibleDC(hdcColorButton);
69         ReleaseDC(hwndColorButton, hdcColorButton);
70 
71         /* Select the button image to it */
72         hgdiTmp = SelectObject(hdcCompat, g->hbmpColor[nButton]);
73 
74         /* Create a brush and draw the rectangle */
75         rect.left = 2;
76         rect.top = 2;
77         rect.right = 22;
78         rect.bottom = 13;
79         hbrush = CreateSolidBrush(g->SchemeAdv.crColor[nColor]);
80         FillRect(hdcCompat, &rect, hbrush);
81         DeleteObject(hbrush);
82 
83         /* hdcCompat is not needed anymore */
84         SelectObject(hdcCompat,hgdiTmp);
85         DeleteDC(hdcCompat);
86 
87         SendDlgItemMessage(hwndDlg, ID, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)g->hbmpColor[nButton]);
88         EnableWindow(GetDlgItem(hwndDlg, ID), TRUE);
89     }
90     else
91     {
92         SendDlgItemMessage(hwndDlg, ID, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)NULL);
93         EnableWindow(GetDlgItem(hwndDlg, ID), FALSE);
94     }
95 }
96 
97 
98 /* Create the basic bitmaps for the color picker buttons */
99 static VOID
InitColorButtons(HWND hwndDlg,GLOBALS * g)100 InitColorButtons(HWND hwndDlg, GLOBALS* g)
101 {
102     INT i;
103     HDC hdcColorButton, hdcCompat;
104     RECT rect;
105     HBRUSH hbrush;
106     HPEN hPen;
107     HWND hwndColorButton;
108     HGDIOBJ hgdiTemp;
109     COLOR_SCHEME *scheme = &g->SchemeAdv;
110 
111     const POINT Points[3] = {{29,6},{33,6},{31,8}};
112 
113     hwndColorButton = GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_COLOR1_B);
114     hdcColorButton = GetDC(hwndColorButton);
115     for (i = 0; i <= 2; i++)
116     {
117         /* Create a DC to draw on */
118         hdcCompat = CreateCompatibleDC(hdcColorButton);
119 
120         /* Create the button image */
121         g->hbmpColor[i] = CreateCompatibleBitmap(hdcColorButton, 36, 15);
122 
123         /* Select the button image to the DC */
124         hgdiTemp = SelectObject(hdcCompat, g->hbmpColor[i]);
125 
126         /* Draw the buttons background color */
127         rect.left = 0;
128         rect.top = 0;
129         rect.right = 36;
130         rect.bottom = 15;
131         hbrush = CreateSolidBrush(scheme->crColor[COLOR_BTNFACE]);
132         FillRect(hdcCompat, &rect, hbrush);
133         DeleteObject(hbrush);
134 
135         /* Draw the rectangle */
136         rect.left = 1;
137         rect.top = 1;
138         rect.right = 23;
139         rect.bottom = 14;
140         hbrush = CreateSolidBrush(scheme->crColor[COLOR_BTNTEXT]);
141         FillRect(hdcCompat, &rect, hbrush);
142         DeleteObject(hbrush);
143 
144         /* Draw left side of line */
145         hPen = CreatePen(PS_SOLID, 1, scheme->crColor[COLOR_BTNSHADOW]);
146         SelectObject(hdcCompat, hPen);
147         MoveToEx(hdcCompat, 26, 1, NULL);
148         LineTo(hdcCompat, 26, 14);
149         SelectObject(hdcCompat, GetStockObject(BLACK_PEN));
150         DeleteObject(hPen);
151 
152         /* Draw right side of line */
153         hPen = CreatePen(PS_SOLID, 1, scheme->crColor[COLOR_BTNHIGHLIGHT]);
154         SelectObject(hdcCompat,hPen);
155         MoveToEx(hdcCompat, 27, 1, NULL);
156         LineTo(hdcCompat, 27, 14);
157         SelectObject(hdcCompat, GetStockObject(BLACK_PEN));
158         DeleteObject(hPen);
159 
160         /* Draw triangle */
161         hPen = CreatePen(PS_SOLID, 1, scheme->crColor[COLOR_BTNTEXT]);
162         hbrush = CreateSolidBrush(scheme->crColor[COLOR_BTNTEXT]);
163         SelectObject(hdcCompat, hPen);
164         SelectObject(hdcCompat, hbrush);
165         SetPolyFillMode(hdcCompat, WINDING);
166 
167         /* FIXME: HACK, see Points definition */
168         Polygon(hdcCompat, Points, 3);
169 
170         /* Cleanup */
171         SelectObject(hdcCompat,hgdiTemp);
172         DeleteDC(hdcCompat);
173         DeleteObject(hPen);
174         DeleteObject(hbrush);
175     }
176 
177     ReleaseDC(hwndColorButton, hdcColorButton);
178 
179     /* Set the images of the buttons */
180     SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_COLOR1_B, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)g->hbmpColor[0]);
181     SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_COLOR2_B, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)g->hbmpColor[1]);
182     SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTCOLOR_B, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)g->hbmpColor[2]);
183 }
184 
185 
186 /* This is the callback function to add the installed fonts to the font combo */
187 static int CALLBACK
EnumFontFamExProc(ENUMLOGFONTEX * lpelfe,NEWTEXTMETRICEX * lpntme,DWORD dwFontType,LPARAM lParam)188 EnumFontFamExProc(ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme, DWORD dwFontType, LPARAM lParam)
189 {
190     /* Don't enumerate more than 100 fonts */
191     if (SendMessage((HWND)lParam, CB_GETCOUNT, 0, 0) >= 100)
192         return 0;
193 
194     /* Only add the string once */
195     if (SendMessage((HWND)lParam, CB_FINDSTRINGEXACT, -1, (WPARAM)&(lpelfe->elfLogFont.lfFaceName)) != CB_ERR)
196         return 2;
197 
198     SendMessage((HWND)lParam, CB_ADDSTRING, 0, (WPARAM)&(lpelfe->elfLogFont.lfFaceName));
199 
200     return 1;
201 }
202 
203 
204 /* Update all the controls with the current values for the selected screen element */
205 static VOID
UpdateControls(HWND hwndDlg,GLOBALS * g)206 UpdateControls(HWND hwndDlg, GLOBALS *g)
207 {
208     INT iElement;
209     HDC hdcDlg;
210 
211     iElement = g->CurrentElement;
212 
213     /* First enable / disable the controls */
214     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_SIZE_E), (g_Assignment[iElement].Size != -1));
215     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_SIZE_UD), (g_Assignment[iElement].Size != -1));
216     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_SIZE_T), (g_Assignment[iElement].Size != -1));
217     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_COLOR1_T), (g_Assignment[iElement].Color1 != -1));
218     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_COLOR2_T), (g_Assignment[iElement].Color2 != -1));
219     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONT_T), (g_Assignment[iElement].Font != -1));
220     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONT_C), (g_Assignment[iElement].Font != -1));
221     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_T), (g_Assignment[iElement].Font != -1));
222     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E), (g_Assignment[iElement].Font != -1));
223     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONTCOLOR_T), (g_Assignment[iElement].FontColor != -1));
224     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD), (g_Assignment[iElement].Font != -1));
225     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC), (g_Assignment[iElement].Font != -1));
226 
227     /* Update the colors of the color buttons */
228     UpdateButtonColor(hwndDlg, g, IDC_ADVAPPEARANCE_COLOR1_B, 0, g_Assignment[iElement].Color1);
229     UpdateButtonColor(hwndDlg, g, IDC_ADVAPPEARANCE_COLOR2_B, 1, g_Assignment[iElement].Color2);
230     UpdateButtonColor(hwndDlg, g, IDC_ADVAPPEARANCE_FONTCOLOR_B, 2, g_Assignment[iElement].FontColor);
231 
232     if (g_Assignment[iElement].Size != -1)
233         SetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_SIZE_E,  SchemeGetMetric(&g->SchemeAdv, g_Assignment[iElement].Size), FALSE);
234     else
235         SetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_SIZE_E, TEXT(""));
236 
237     hdcDlg = GetDC(hwndDlg);
238     if (g_Assignment[iElement].Font != -1)
239     {
240         PLOGFONTW plfFont = SchemeGetFont(&g->SchemeAdv, g_Assignment[iElement].Font);
241 
242         SetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, plfFont->lfFaceName);
243         SetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E, -MulDiv(plfFont->lfHeight, 72, GetDeviceCaps(hdcDlg, LOGPIXELSY)), FALSE);
244         SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, CB_FINDSTRINGEXACT, -1, (WPARAM)plfFont->lfFaceName);
245         SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_SETCHECK, plfFont->lfWeight == FW_BOLD?1:0, 0);
246         SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_SETCHECK, plfFont->lfItalic, 0);
247     }
248     else
249     {
250         SetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, NULL);
251         SetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E, NULL);
252         SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_SETCHECK, 0, 0);
253         SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_SETCHECK, 0, 0);
254     }
255 
256     ReleaseDC(hwndDlg, hdcDlg);
257 }
258 
259 
260 static VOID
SaveCurrentValues(HWND hwndDlg,GLOBALS * g)261 SaveCurrentValues(HWND hwndDlg, GLOBALS *g)
262 {
263     BOOL bTranslated;
264     HDC hdcDlg = GetDC(hwndDlg);
265 
266     if (g_Assignment[g->CurrentElement].Size != -1)
267     {
268         SchemeSetMetric(&g->SchemeAdv, g_Assignment[g->CurrentElement].Size, GetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_SIZE_E, &bTranslated, FALSE));
269     }
270 
271     if (g_Assignment[g->CurrentElement].Font != -1)
272     {
273         PLOGFONTW plfFont = SchemeGetFont(&g->SchemeAdv, g_Assignment[g->CurrentElement].Font);
274         plfFont->lfHeight = -MulDiv(GetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E, &bTranslated, FALSE), GetDeviceCaps(hdcDlg, LOGPIXELSY), 72);
275         plfFont->lfWeight = (SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_GETCHECK, 0, 0) == 1) ? FW_BOLD : FW_NORMAL;
276         plfFont->lfItalic = (BYTE)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_GETCHECK, 0, 0);
277         GetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, plfFont->lfFaceName, LF_FACESIZE);
278     }
279 
280     ReleaseDC(hwndDlg, hdcDlg);
281 }
282 
283 
284 /* Select a color using a color picker */
285 static BOOL
GetColor(HWND hwndDlg,GLOBALS * g,INT nButton)286 GetColor(HWND hwndDlg, GLOBALS* g, INT nButton)
287 {
288     CHOOSECOLOR cc;
289     COLORREF crColor;
290     INT ID = 0;
291     INT ColorIndex = 0;
292 
293     /* Get the color index from the element index and button number */
294     switch (nButton)
295     {
296         case 0:
297             ColorIndex = g_Assignment[g->CurrentElement].Color1;
298             ID = IDC_ADVAPPEARANCE_COLOR1_B;
299             break;
300 
301         case 1:
302             ColorIndex = g_Assignment[g->CurrentElement].Color2;
303             ID = IDC_ADVAPPEARANCE_COLOR2_B;
304             break;
305 
306         case 2:
307             ColorIndex = g_Assignment[g->CurrentElement].FontColor;
308             ID = IDC_ADVAPPEARANCE_FONTCOLOR_B;
309             break;
310     }
311 
312     crColor = g->SchemeAdv.crColor[ColorIndex];
313 
314     /* Prepare cc structure */
315     cc.lStructSize = sizeof(CHOOSECOLOR);
316     cc.hwndOwner = hwndDlg;
317     cc.hInstance = NULL;
318     cc.rgbResult = crColor;
319     cc.lpCustColors = g->crCustom;
320     cc.Flags = CC_ANYCOLOR | CC_FULLOPEN | CC_RGBINIT;
321     cc.lCustData = 0;
322     cc.lpfnHook = NULL;
323     cc.lpTemplateName = NULL;
324 
325     /* Create the colorpicker */
326     if (ChooseColor(&cc))
327     {
328         g->SchemeAdv.crColor[ColorIndex] = cc.rgbResult;
329         if (crColor != cc.rgbResult)
330         {
331             UpdateButtonColor(hwndDlg, g, ID, nButton, ColorIndex);
332             SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
333             return TRUE;
334         }
335     }
336 
337     return FALSE;
338 }
339 
340 
341 /* Initialize the advanced appearance dialog */
342 static VOID
AdvAppearanceDlg_Init(HWND hwndDlg,GLOBALS * g)343 AdvAppearanceDlg_Init(HWND hwndDlg, GLOBALS *g)
344 {
345     INT i, iElement, iListIndex, iDeskIndex = 0;
346     TCHAR tstrText[80];
347     LOGFONT lfFont;
348     LOGFONT lfButtonFont;
349     HFONT hMyFont;
350     HDC hScreenDC;
351     TCHAR Size[4];
352 
353     /* Copy the current theme values */
354     g->SchemeAdv = g->Scheme;
355 
356     SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
357 
358     /* Add the elements to the combo */
359     for (iElement = 0; iElement < NUM_ELEMENTS; iElement++)
360     {
361         LoadString(hApplet, IDS_ELEMENT_0 + iElement, (LPTSTR)&tstrText, 79);
362         iListIndex = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_ADDSTRING, 0, (LPARAM)&tstrText);
363         SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_SETITEMDATA, (WPARAM)iListIndex, (LPARAM)iElement);
364     }
365 
366     /* Get the list index of the desktop element */
367     for (iListIndex = 0; iListIndex < NUM_ELEMENTS; iListIndex++)
368     {
369         iElement = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETITEMDATA, (WPARAM)iListIndex, 0);
370         if (iElement == 0)
371         {
372             iDeskIndex = iListIndex;
373             break;
374         }
375     }
376 
377     SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_SETCURSEL, iDeskIndex, 0);
378 
379     /* Create font for bold button */
380     lfButtonFont = g->Scheme.ncMetrics.lfMessageFont;
381     lfButtonFont.lfWeight = FW_BOLD;
382     lfButtonFont.lfItalic = FALSE;
383     hMyFont = CreateFontIndirect(&lfButtonFont);
384     if (hMyFont)
385     {
386         if (g->hBoldFont)
387             DeleteObject(g->hBoldFont);
388 
389         g->hBoldFont = hMyFont;
390     }
391 
392     /* Create font for italic button */
393     lfButtonFont.lfWeight = FW_REGULAR;
394     lfButtonFont.lfItalic = TRUE;
395     hMyFont = CreateFontIndirect(&lfButtonFont);
396     if (hMyFont)
397     {
398         if (g->hItalicFont)
399             DeleteObject(g->hItalicFont);
400 
401         g->hItalicFont = hMyFont;
402     }
403 
404     /* Set the fonts for the font style buttons */
405     SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, WM_SETFONT, (WPARAM)g->hBoldFont, (LPARAM)TRUE);
406     SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, WM_SETFONT, (WPARAM)g->hItalicFont, (LPARAM)TRUE);
407 
408     /* Draw Bitmaps for the colorbuttons */
409     InitColorButtons(hwndDlg, g);
410 
411     /* Make the UpDown control count correctly */
412     SendMessage(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_SIZE_UD), UDM_SETRANGE, 0L, MAKELONG (200, 1));
413 
414     /* Fill font selection combo */
415     lfFont.lfCharSet = DEFAULT_CHARSET;
416     lfFont.lfFaceName[0] = (TCHAR)0;
417     lfFont.lfPitchAndFamily = 0;
418     hScreenDC = GetDC(0);
419     EnumFontFamiliesEx(hScreenDC, &lfFont, (FONTENUMPROC)EnumFontFamExProc, (LPARAM)GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONT_C), 0);
420     ReleaseDC(0, hScreenDC);
421 
422     /* Fill font size combo */
423     for (i = 6; i <= 24; i++)
424     {
425         StringCbPrintf(Size, sizeof(Size), TEXT("%d"), i);
426         SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E, CB_ADDSTRING, 0, (LPARAM)&Size);
427     }
428 
429     /* Update the controls */
430     iListIndex = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETCURSEL, 0, 0);
431     g->CurrentElement = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETITEMDATA, (WPARAM)iListIndex, 0);
432     UpdateControls(hwndDlg, g);
433 }
434 
435 
436 static VOID
AdvAppearanceDlg_CleanUp(HWND hwndDlg,GLOBALS * g)437 AdvAppearanceDlg_CleanUp(HWND hwndDlg, GLOBALS* g)
438 {
439     DeleteObject(g->hBoldFont);
440     DeleteObject(g->hItalicFont);
441 }
442 
443 
444 static VOID
SelectComboByElement(HWND hwnd,INT id,LPARAM lParam)445 SelectComboByElement(HWND hwnd, INT id, LPARAM lParam)
446 {
447     INT nCount;
448     INT i;
449 
450     nCount = SendDlgItemMessage(hwnd, id, CB_GETCOUNT, 0, 0);
451     if (nCount == CB_ERR)
452         return;
453 
454     for (i = 0; i < nCount; i++)
455     {
456         if (SendDlgItemMessage(hwnd, id, CB_GETITEMDATA, (WPARAM)i, 0) == lParam)
457         {
458             SendDlgItemMessage(hwnd, id, CB_SETCURSEL, (WPARAM)i, 0);
459             break;
460         }
461     }
462 }
463 
464 
465 static VOID
GetSelectedComboText(HWND hwnd,INT id,LPWSTR lpStr)466 GetSelectedComboText(HWND hwnd, INT id, LPWSTR lpStr)
467 {
468     INT nCount;
469 
470     nCount = SendDlgItemMessage(hwnd, id, CB_GETCURSEL, 0, 0);
471     if (nCount == CB_ERR)
472     {
473         *lpStr = 0;
474         return;
475     }
476 
477     nCount = SendDlgItemMessage(hwnd, id, CB_GETLBTEXT, (WPARAM)nCount, (LPARAM)lpStr);
478     if (nCount == CB_ERR)
479     {
480         *lpStr = 0;
481     }
482 }
483 
484 
485 static INT
GetSelectedComboInt(HWND hwnd,INT id)486 GetSelectedComboInt(HWND hwnd, INT id)
487 {
488     TCHAR szBuffer[80];
489     INT nCount;
490 
491     nCount = SendDlgItemMessage(hwnd, id, CB_GETCURSEL, 0, 0);
492     if (nCount == CB_ERR)
493         return 0;
494 
495     nCount = SendDlgItemMessage(hwnd, id, CB_GETLBTEXT, (WPARAM)nCount, (LPARAM)szBuffer);
496     if (nCount == CB_ERR)
497         return 0;
498 
499     return _ttoi(szBuffer);
500 }
501 
502 INT_PTR CALLBACK
AdvAppearanceDlgProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)503 AdvAppearanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
504 {
505     INT iSelection, iProperty;
506     GLOBALS* g;
507     PLOGFONTW plfFont;
508 
509     g = (GLOBALS*)GetWindowLongPtr(hwndDlg, DWLP_USER);
510 
511     switch (uMsg)
512     {
513         case WM_INITDIALOG:
514             g = (GLOBALS*)lParam;
515             SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)g);
516             AdvAppearanceDlg_Init(hwndDlg, g);
517             break;
518 
519         case WM_DESTROY:
520             AdvAppearanceDlg_CleanUp(hwndDlg, g);
521             break;
522 
523         case WM_COMMAND:
524             if (g == NULL)
525                 return TRUE;
526 
527             switch(LOWORD(wParam))
528             {
529                 case IDOK:
530                     SaveCurrentValues(hwndDlg, g);
531                     EndDialog(hwndDlg, IDOK);
532                     break;
533 
534                 case IDCANCEL:
535                     g->SchemeAdv = g->Scheme;
536                     EndDialog(hwndDlg, IDCANCEL);
537                     break;
538 
539                 case IDC_APPEARANCE_PREVIEW:
540                     SaveCurrentValues(hwndDlg, g);
541                     SelectComboByElement(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, lParam);
542                     g->CurrentElement = (INT)lParam;
543                     UpdateControls(hwndDlg, g);
544                     break;
545 
546                 case IDC_ADVAPPEARANCE_ELEMENT:
547                     if (HIWORD(wParam) == CBN_SELCHANGE)
548                     {
549                         SaveCurrentValues(hwndDlg, g);
550                         iSelection = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETCURSEL, 0, 0);
551                         g->CurrentElement = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETITEMDATA, iSelection, 0);
552                         UpdateControls(hwndDlg, g);
553                     }
554                     break;
555 
556                 case IDC_ADVAPPEARANCE_SIZE_E:
557                     if (HIWORD(wParam) == EN_CHANGE)
558                     {
559                         iProperty = g_Assignment[g->CurrentElement].Size;
560                         if (iProperty == -1)
561                             return TRUE;
562 
563                         iSelection = LOWORD(SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_SIZE_UD, UDM_GETPOS,0,0L));
564                         SchemeSetMetric(&g->SchemeAdv, iProperty, iSelection);
565                         SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETSIZE, iProperty, iSelection);
566 
567                         iProperty = g_Assignment[g->CurrentElement].Size2;
568                         if (iProperty != -1)
569                             SchemeSetMetric(&g->SchemeAdv, iProperty, iSelection);
570                     }
571                     break;
572 
573                 case IDC_ADVAPPEARANCE_FONT_C:
574                     if (HIWORD(wParam) == CBN_SELCHANGE)
575                     {
576                         iProperty = g_Assignment[g->CurrentElement].Font;
577                         if (iProperty == -1)
578                             return TRUE;
579 
580                         plfFont = SchemeGetFont(&g->SchemeAdv, iProperty);
581                         GetSelectedComboText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, plfFont->lfFaceName);
582                         SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETFONT, iProperty, (LPARAM)plfFont);
583                     }
584                     break;
585 
586                 case IDC_ADVAPPEARANCE_FONTSIZE_E:
587                     if ((HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == CBN_EDITCHANGE))
588                     {
589                         HDC hdcDlg;
590 
591                         iProperty =  g_Assignment[g->CurrentElement].Font;
592                         if (iProperty == -1)
593                             return TRUE;
594 
595                         hdcDlg = GetDC(hwndDlg);
596 
597                         plfFont = SchemeGetFont(&g->SchemeAdv, iProperty);
598                         iSelection = GetSelectedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E);
599                         plfFont->lfHeight = -MulDiv(iSelection , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72);
600                         SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
601 
602                         ReleaseDC(hwndDlg, hdcDlg);
603                     }
604                     break;
605 
606                 case IDC_ADVAPPEARANCE_FONTBOLD:
607                     if (HIWORD(wParam) == BN_CLICKED)
608                     {
609                         iProperty = g_Assignment[g->CurrentElement].Font;
610                         if (iProperty == -1)
611                             return TRUE;
612 
613                         plfFont = SchemeGetFont(&g->SchemeAdv, iProperty);
614                         iSelection = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_GETCHECK, 0, 0);
615                         plfFont->lfWeight = (iSelection == BST_CHECKED) ? FW_BOLD : FW_NORMAL;
616                         SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETFONT, iProperty, (LPARAM)plfFont);
617                     }
618                     break;
619 
620                 case IDC_ADVAPPEARANCE_FONTITALIC:
621                     if (HIWORD(wParam) == BN_CLICKED)
622                     {
623                         iProperty = g_Assignment[g->CurrentElement].Font;
624                         if (iProperty == -1)
625                             return TRUE;
626 
627                         plfFont = SchemeGetFont(&g->SchemeAdv, iProperty);
628                         iSelection = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_GETCHECK, 0, 0);
629                         plfFont->lfItalic = (iSelection == BST_CHECKED) ? TRUE : FALSE;
630                         SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETFONT, iProperty, (LPARAM)plfFont);
631                     }
632                     break;
633 
634                 case IDC_ADVAPPEARANCE_COLOR1_B:
635                     GetColor(hwndDlg, g, 0);
636                     break;
637 
638                 case IDC_ADVAPPEARANCE_COLOR2_B:
639                     GetColor(hwndDlg, g, 1);
640                     break;
641 
642                 case IDC_ADVAPPEARANCE_FONTCOLOR_B:
643                     GetColor(hwndDlg, g, 2);
644                     break;
645 
646                 default:
647                     return FALSE;
648             }
649             break;
650 
651         default:
652             return FALSE;
653     }
654 
655     return TRUE;
656 }
657