[DESK.CPL]: Fix trailing whitespace, some indent + code formatting style.
[reactos.git] / reactos / dll / cpl / desk / advappdlg.c
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
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
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
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
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
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
286 GetColor(HWND hwndDlg, GLOBALS* g, INT nButton)
287 {
288 CHOOSECOLOR cc;
289 COLORREF crCustom[16] = { 0 };
290 COLORREF crColor;
291 INT ID = 0;
292 INT ColorIndex = 0;
293
294 /* Get the color index from the element index and button number */
295 switch (nButton)
296 {
297 case 0:
298 ColorIndex = g_Assignment[g->CurrentElement].Color1;
299 ID = IDC_ADVAPPEARANCE_COLOR1_B;
300 break;
301
302 case 1:
303 ColorIndex = g_Assignment[g->CurrentElement].Color2;
304 ID = IDC_ADVAPPEARANCE_COLOR2_B;
305 break;
306
307 case 2:
308 ColorIndex = g_Assignment[g->CurrentElement].FontColor;
309 ID = IDC_ADVAPPEARANCE_FONTCOLOR_B;
310 break;
311 }
312
313 crColor = g->SchemeAdv.crColor[ColorIndex];
314
315 /* Prepare cc structure */
316 cc.lStructSize = sizeof(CHOOSECOLOR);
317 cc.hwndOwner = hwndDlg;
318 cc.hInstance = NULL;
319 cc.rgbResult = crColor;
320 cc.lpCustColors = crCustom;
321 cc.Flags = CC_ANYCOLOR | CC_FULLOPEN | CC_RGBINIT;
322 cc.lCustData = 0;
323 cc.lpfnHook = NULL;
324 cc.lpTemplateName = NULL;
325
326 /* Create the colorpicker */
327 if (ChooseColor(&cc))
328 {
329 g->SchemeAdv.crColor[ColorIndex] = cc.rgbResult;
330 if (crColor != cc.rgbResult)
331 {
332 UpdateButtonColor(hwndDlg, g, ID, nButton, ColorIndex);
333 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
334 return TRUE;
335 }
336 }
337
338 return FALSE;
339 }
340
341
342 /* Initialize the advanced appearance dialog */
343 static VOID
344 AdvAppearanceDlg_Init(HWND hwndDlg, GLOBALS *g)
345 {
346 INT i, iElement, iListIndex, iDeskIndex = 0;
347 TCHAR tstrText[80];
348 LOGFONT lfFont;
349 LOGFONT lfButtonFont;
350 HFONT hMyFont;
351 HDC hScreenDC;
352 TCHAR Size[4];
353
354 /* Copy the current theme values */
355 g->SchemeAdv = g->Scheme;
356
357 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
358
359 /* Add the elements to the combo */
360 for (iElement = 0; iElement < NUM_ELEMENTS; iElement++)
361 {
362 LoadString(hApplet, IDS_ELEMENT_0 + iElement, (LPTSTR)&tstrText, 79);
363 iListIndex = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_ADDSTRING, 0, (LPARAM)&tstrText);
364 SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_SETITEMDATA, (WPARAM)iListIndex, (LPARAM)iElement);
365 }
366
367 /* Get the list index of the desktop element */
368 for (iListIndex = 0; iListIndex < NUM_ELEMENTS; iListIndex++)
369 {
370 iElement = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETITEMDATA, (WPARAM)iListIndex, 0);
371 if (iElement == 0)
372 {
373 iDeskIndex = iListIndex;
374 break;
375 }
376 }
377
378 SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_SETCURSEL, iDeskIndex, 0);
379
380 /* Create font for bold button */
381 lfButtonFont = g->Scheme.ncMetrics.lfMessageFont;
382 lfButtonFont.lfWeight = FW_BOLD;
383 lfButtonFont.lfItalic = FALSE;
384 hMyFont = CreateFontIndirect(&lfButtonFont);
385 if (hMyFont)
386 {
387 if (g->hBoldFont)
388 DeleteObject(g->hBoldFont);
389
390 g->hBoldFont = hMyFont;
391 }
392
393 /* Create font for italic button */
394 lfButtonFont.lfWeight = FW_REGULAR;
395 lfButtonFont.lfItalic = TRUE;
396 hMyFont = CreateFontIndirect(&lfButtonFont);
397 if (hMyFont)
398 {
399 if (g->hItalicFont)
400 DeleteObject(g->hItalicFont);
401
402 g->hItalicFont = hMyFont;
403 }
404
405 /* Set the fonts for the font style buttons */
406 SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, WM_SETFONT, (WPARAM)g->hBoldFont, (LPARAM)TRUE);
407 SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, WM_SETFONT, (WPARAM)g->hItalicFont, (LPARAM)TRUE);
408
409 /* Draw Bitmaps for the colorbuttons */
410 InitColorButtons(hwndDlg, g);
411
412 /* Make the UpDown control count correctly */
413 SendMessage(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_SIZE_UD), UDM_SETRANGE, 0L, MAKELONG (200, 1));
414
415 /* Fill font selection combo */
416 lfFont.lfCharSet = DEFAULT_CHARSET;
417 lfFont.lfFaceName[0] = (TCHAR)0;
418 lfFont.lfPitchAndFamily = 0;
419 hScreenDC = GetDC(0);
420 EnumFontFamiliesEx(hScreenDC, &lfFont, (FONTENUMPROC)EnumFontFamExProc, (LPARAM)GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONT_C), 0);
421 ReleaseDC(0, hScreenDC);
422
423 /* Fill font size combo */
424 for (i = 6; i <= 24; i++)
425 {
426 StringCbPrintf(Size, sizeof(Size), TEXT("%d"), i);
427 SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E, CB_ADDSTRING, 0, (LPARAM)&Size);
428 }
429
430 /* Update the controls */
431 iListIndex = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETCURSEL, 0, 0);
432 g->CurrentElement = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETITEMDATA, (WPARAM)iListIndex, 0);
433 UpdateControls(hwndDlg, g);
434 }
435
436
437 static VOID
438 AdvAppearanceDlg_CleanUp(HWND hwndDlg, GLOBALS* g)
439 {
440 DeleteObject(g->hBoldFont);
441 DeleteObject(g->hItalicFont);
442 }
443
444
445 static VOID
446 SelectComboByElement(HWND hwnd, INT id, LPARAM lParam)
447 {
448 INT nCount;
449 INT i;
450
451 nCount = SendDlgItemMessage(hwnd, id, CB_GETCOUNT, 0, 0);
452 if (nCount == CB_ERR)
453 return;
454
455 for (i = 0; i < nCount; i++)
456 {
457 if (SendDlgItemMessage(hwnd, id, CB_GETITEMDATA, (WPARAM)i, 0) == lParam)
458 {
459 SendDlgItemMessage(hwnd, id, CB_SETCURSEL, (WPARAM)i, 0);
460 break;
461 }
462 }
463 }
464
465
466 static VOID
467 GetSelectedComboText(HWND hwnd, INT id, LPWSTR lpStr)
468 {
469 INT nCount;
470
471 nCount = SendDlgItemMessage(hwnd, id, CB_GETCURSEL, 0, 0);
472 if (nCount == CB_ERR)
473 {
474 *lpStr = 0;
475 return;
476 }
477
478 nCount = SendDlgItemMessage(hwnd, id, CB_GETLBTEXT, (WPARAM)nCount, (LPARAM)lpStr);
479 if (nCount == CB_ERR)
480 {
481 *lpStr = 0;
482 }
483 }
484
485
486 static INT
487 GetSelectedComboInt(HWND hwnd, INT id)
488 {
489 TCHAR szBuffer[80];
490 INT nCount;
491
492 nCount = SendDlgItemMessage(hwnd, id, CB_GETCURSEL, 0, 0);
493 if (nCount == CB_ERR)
494 return 0;
495
496 nCount = SendDlgItemMessage(hwnd, id, CB_GETLBTEXT, (WPARAM)nCount, (LPARAM)szBuffer);
497 if (nCount == CB_ERR)
498 return 0;
499
500 return _ttoi(szBuffer);
501 }
502
503 INT_PTR CALLBACK
504 AdvAppearanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
505 {
506 INT iSelection, iProperty;
507 GLOBALS* g;
508 PLOGFONTW plfFont;
509
510 g = (GLOBALS*)GetWindowLongPtr(hwndDlg, DWLP_USER);
511
512 switch (uMsg)
513 {
514 case WM_INITDIALOG:
515 g = (GLOBALS*)lParam;
516 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)g);
517 AdvAppearanceDlg_Init(hwndDlg, g);
518 break;
519
520 case WM_DESTROY:
521 AdvAppearanceDlg_CleanUp(hwndDlg, g);
522 break;
523
524 case WM_COMMAND:
525 if (g == NULL)
526 return TRUE;
527
528 switch(LOWORD(wParam))
529 {
530 case IDOK:
531 SaveCurrentValues(hwndDlg, g);
532 EndDialog(hwndDlg, IDOK);
533 break;
534
535 case IDCANCEL:
536 g->SchemeAdv = g->Scheme;
537 EndDialog(hwndDlg, IDCANCEL);
538 break;
539
540 case IDC_APPEARANCE_PREVIEW:
541 SaveCurrentValues(hwndDlg, g);
542 SelectComboByElement(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, lParam);
543 g->CurrentElement = (INT)lParam;
544 UpdateControls(hwndDlg, g);
545 break;
546
547 case IDC_ADVAPPEARANCE_ELEMENT:
548 if (HIWORD(wParam) == CBN_SELCHANGE)
549 {
550 SaveCurrentValues(hwndDlg, g);
551 iSelection = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETCURSEL, 0, 0);
552 g->CurrentElement = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETITEMDATA, iSelection, 0);
553 UpdateControls(hwndDlg, g);
554 }
555 break;
556
557 case IDC_ADVAPPEARANCE_SIZE_E:
558 if (HIWORD(wParam) == EN_CHANGE)
559 {
560 iProperty = g_Assignment[g->CurrentElement].Size;
561 if (iProperty == -1)
562 return TRUE;
563
564 iSelection = LOWORD(SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_SIZE_UD, UDM_GETPOS,0,0L));
565 SchemeSetMetric(&g->SchemeAdv, iProperty, iSelection);
566 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETSIZE, iProperty, iSelection);
567
568 iProperty = g_Assignment[g->CurrentElement].Size2;
569 if (iProperty != -1)
570 SchemeSetMetric(&g->SchemeAdv, iProperty, iSelection);
571 }
572 break;
573
574 case IDC_ADVAPPEARANCE_FONT_C:
575 if (HIWORD(wParam) == CBN_SELCHANGE)
576 {
577 iProperty = g_Assignment[g->CurrentElement].Font;
578 if (iProperty == -1)
579 return TRUE;
580
581 plfFont = SchemeGetFont(&g->SchemeAdv, iProperty);
582 GetSelectedComboText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, plfFont->lfFaceName);
583 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETFONT, iProperty, (LPARAM)plfFont);
584 }
585 break;
586
587 case IDC_ADVAPPEARANCE_FONTSIZE_E:
588 if ((HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == CBN_EDITCHANGE))
589 {
590 HDC hdcDlg;
591
592 iProperty = g_Assignment[g->CurrentElement].Font;
593 if (iProperty == -1)
594 return TRUE;
595
596 hdcDlg = GetDC(hwndDlg);
597
598 plfFont = SchemeGetFont(&g->SchemeAdv, iProperty);
599 iSelection = GetSelectedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E);
600 plfFont->lfHeight = -MulDiv(iSelection , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72);
601 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
602
603 ReleaseDC(hwndDlg, hdcDlg);
604 }
605 break;
606
607 case IDC_ADVAPPEARANCE_FONTBOLD:
608 if (HIWORD(wParam) == BN_CLICKED)
609 {
610 iProperty = g_Assignment[g->CurrentElement].Font;
611 if (iProperty == -1)
612 return TRUE;
613
614 plfFont = SchemeGetFont(&g->SchemeAdv, iProperty);
615 iSelection = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_GETCHECK, 0, 0);
616 plfFont->lfWeight = (iSelection == BST_CHECKED) ? FW_BOLD : FW_NORMAL;
617 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETFONT, iProperty, (LPARAM)plfFont);
618 }
619 break;
620
621 case IDC_ADVAPPEARANCE_FONTITALIC:
622 if (HIWORD(wParam) == BN_CLICKED)
623 {
624 iProperty = g_Assignment[g->CurrentElement].Font;
625 if (iProperty == -1)
626 return TRUE;
627
628 plfFont = SchemeGetFont(&g->SchemeAdv, iProperty);
629 iSelection = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_GETCHECK, 0, 0);
630 plfFont->lfItalic = (iSelection == BST_CHECKED) ? TRUE : FALSE;
631 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETFONT, iProperty, (LPARAM)plfFont);
632 }
633 break;
634
635 case IDC_ADVAPPEARANCE_COLOR1_B:
636 GetColor(hwndDlg, g, 0);
637 break;
638
639 case IDC_ADVAPPEARANCE_COLOR2_B:
640 GetColor(hwndDlg, g, 1);
641 break;
642
643 case IDC_ADVAPPEARANCE_FONTCOLOR_B:
644 GetColor(hwndDlg, g, 2);
645 break;
646
647 default:
648 return FALSE;
649 }
650 break;
651
652 default:
653 return FALSE;
654 }
655
656 return TRUE;
657 }