* LICENSE: GPL - See COPYING in the top level directory
* FILE: lib/cpl/desk/preview.c
* PURPOSE: Draws the preview control
- * COPYRIGHT: Copyright 2006, 2007 Eric Kohl (email?)
+ * COPYRIGHT: Copyright 2006, 2007 Eric Kohl
*/
#include "desk.h"
+#include "theme.h"
#include "preview.h"
+#include "draw.h"
static const TCHAR szPreviewWndClass[] = TEXT("PreviewWndClass");
{
HWND hwndParent;
- DWORD clrDesktop;
- HBRUSH hbrDesktop;
-
- DWORD clrWindow;
- HBRUSH hbrWindow;
+ THEME Theme;
- DWORD clrScrollbar;
HBRUSH hbrScrollbar;
-
- DWORD clrActiveCaptionText;
- DWORD clrInactiveCaptionText;
- DWORD clrWindowText;
- DWORD clrButtonText;
+ HBRUSH hbrDesktop;
+ HBRUSH hbrWindow;
INT cxEdge;
INT cyEdge;
INT cySizeFrame;
INT cyCaption;
+ INT cyBorder;
INT cyMenu;
INT cxScrollbar;
LPTSTR lpMessText;
LPTSTR lpButText;
- LOGFONT lfCaptionFont;
- LOGFONT lfMenuFont;
- LOGFONT lfMessageFont;
-
HFONT hCaptionFont;
HFONT hMenuFont;
HFONT hMessageFont;
+ HFONT hClientFont;
HMENU hMenu;
} PREVIEW_DATA, *PPREVIEW_DATA;
-
-static VOID
-DrawCaptionButtons(HDC hdc, LPRECT lpRect, BOOL bMinMax, int x)
+static VOID UpdatePreviewTheme(HWND hwnd, PPREVIEW_DATA pPreviewData, THEME *theme)
{
- RECT rc3;
- RECT rc4;
- RECT rc5;
-
- rc3.left = lpRect->right - 2 - x;
- rc3.top = lpRect->top + 2;
- rc3.right = lpRect->right - 2;
- rc3.bottom = lpRect->bottom - 2;
-
- DrawFrameControl(hdc, &rc3, DFC_CAPTION, DFCS_CAPTIONCLOSE);
-
- if (bMinMax)
- {
- rc4.left = rc3.left - x - 2;
- rc4.top = rc3.top;
- rc4.right = rc3.right - x - 2;
- rc4.bottom = rc3.bottom;
-
- DrawFrameControl(hdc, &rc4, DFC_CAPTION, DFCS_CAPTIONMAX);
-
- rc5.left = rc4.left - x;
- rc5.top = rc4.top;
- rc5.right = rc4.right - x;
- rc5.bottom = rc4.bottom;
-
- DrawFrameControl(hdc, &rc5, DFC_CAPTION, DFCS_CAPTIONMIN);
- }
+ if (pPreviewData->hbrScrollbar != NULL)
+ DeleteObject(pPreviewData->hbrScrollbar);
+ pPreviewData->hbrScrollbar = CreateSolidBrush(theme->crColor[COLOR_SCROLLBAR]);
+ if (pPreviewData->hbrDesktop != NULL)
+ DeleteObject(pPreviewData->hbrDesktop);
+ pPreviewData->hbrDesktop = CreateSolidBrush(theme->crColor[COLOR_DESKTOP]);
+ if (pPreviewData->hbrWindow != NULL)
+ DeleteObject(pPreviewData->hbrWindow);
+ pPreviewData->hbrWindow = CreateSolidBrush(theme->crColor[COLOR_WINDOW]);
+
+ pPreviewData->cxEdge = theme->Size[SIZE_EDGE_X] - 2; /* SM_CXEDGE */
+ pPreviewData->cyEdge = theme->Size[SIZE_EDGE_Y] - 2; /* SM_CYEDGE */
+
+ pPreviewData->cySizeFrame = theme->Size[SIZE_FRAME_Y] - 1; /* SM_CYSIZEFRAME */
+
+ pPreviewData->cyCaption = theme->Size[SIZE_CAPTION_Y]; /* SM_CYCAPTION */
+ pPreviewData->cyMenu = theme->Size[SIZE_MENU_Y]; /* SM_CYMENU */
+ pPreviewData->cxScrollbar = theme->Size[SIZE_SCROLL_X]; /* SM_CXVSCROLL */
+ pPreviewData->cyBorder = theme->Size[SIZE_BORDER_Y]; /* SM_CYBORDER */
+
+ if (pPreviewData->hCaptionFont != NULL)
+ DeleteObject(pPreviewData->hCaptionFont);
+ pPreviewData->hCaptionFont = CreateFontIndirect(&theme->lfFont[FONT_CAPTION]);
+
+ if (pPreviewData->hMenuFont != NULL)
+ DeleteObject(pPreviewData->hMenuFont);
+ pPreviewData->hMenuFont = CreateFontIndirect(&theme->lfFont[FONT_MENU]);
+
+ if (pPreviewData->hMessageFont != NULL)
+ DeleteObject(pPreviewData->hMessageFont);
+ pPreviewData->hMessageFont = CreateFontIndirect(&theme->lfFont[FONT_DIALOG]);
+
+ pPreviewData->Theme = *theme;
+ InvalidateRect(hwnd, NULL, FALSE);
}
-
-static VOID
-DrawScrollbar(HDC hdc, LPRECT rc, HBRUSH hbrScrollbar)
-{
- RECT rcTop;
- RECT rcBottom;
- RECT rcMiddle;
- int width;
-
- width = rc->right - rc->left;
-
- rcTop.left = rc->left;
- rcTop.right = rc->right;
- rcTop.top = rc->top;
- rcTop.bottom = rc->top + width;
-
- rcMiddle.left = rc->left;
- rcMiddle.right = rc->right;
- rcMiddle.top = rc->top + width;
- rcMiddle.bottom = rc->bottom - width;
-
- rcBottom.left = rc->left;
- rcBottom.right = rc->right;
- rcBottom.top = rc->bottom - width;
- rcBottom.bottom = rc->bottom;
-
- DrawFrameControl(hdc, &rcTop, DFC_SCROLL, DFCS_SCROLLUP);
- DrawFrameControl(hdc, &rcBottom, DFC_SCROLL, DFCS_SCROLLDOWN);
-
- FillRect(hdc, &rcMiddle, hbrScrollbar);
-}
-
-
static VOID
OnCreate(HWND hwnd, PPREVIEW_DATA pPreviewData)
{
- NONCLIENTMETRICS NonClientMetrics;
-
- pPreviewData->clrScrollbar = GetSysColor(COLOR_SCROLLBAR);
- pPreviewData->hbrScrollbar = CreateSolidBrush(pPreviewData->clrScrollbar);
-
- pPreviewData->clrDesktop = GetSysColor(COLOR_DESKTOP);
- pPreviewData->hbrDesktop = CreateSolidBrush(pPreviewData->clrDesktop);
- pPreviewData->clrWindow = GetSysColor(COLOR_WINDOW);
- pPreviewData->hbrWindow = CreateSolidBrush(pPreviewData->clrWindow);
-
- pPreviewData->clrActiveCaptionText = GetSysColor(COLOR_CAPTIONTEXT);
- pPreviewData->clrInactiveCaptionText = GetSysColor(COLOR_INACTIVECAPTIONTEXT);
- pPreviewData->clrWindowText = GetSysColor(COLOR_WINDOWTEXT);
- pPreviewData->clrButtonText = GetSysColor(COLOR_BTNTEXT);
-
- pPreviewData->cxEdge = GetSystemMetrics(SM_CXEDGE) - 2;
- pPreviewData->cyEdge = GetSystemMetrics(SM_CXEDGE) - 2;
-
- pPreviewData->cySizeFrame = GetSystemMetrics(SM_CYSIZEFRAME) - 1;
+ THEME *theme;
- pPreviewData->cyCaption = GetSystemMetrics(SM_CYCAPTION);
- pPreviewData->cyMenu = GetSystemMetrics(SM_CYMENU);
- pPreviewData->cxScrollbar = GetSystemMetrics(SM_CXVSCROLL);
-
- /* load font info */
- NonClientMetrics.cbSize = sizeof(NONCLIENTMETRICS);
- SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0);
-
- pPreviewData->lfCaptionFont = NonClientMetrics.lfCaptionFont;
- pPreviewData->hCaptionFont = CreateFontIndirect(&pPreviewData->lfCaptionFont);
-
- pPreviewData->lfMenuFont = NonClientMetrics.lfMenuFont;
- pPreviewData->hMenuFont = CreateFontIndirect(&pPreviewData->lfMenuFont);
-
- pPreviewData->lfMessageFont = NonClientMetrics.lfMessageFont;
- pPreviewData->hMessageFont = CreateFontIndirect(&pPreviewData->lfMessageFont);
+ pPreviewData->hClientFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
/* Load and modify the menu */
pPreviewData->hMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDR_PREVIEW_MENU));
- EnableMenuItem(pPreviewData->hMenu, ID_MENU_DISABLED,
- MF_BYCOMMAND | MF_DISABLED);
+ EnableMenuItem(pPreviewData->hMenu,
+ 1, MF_BYPOSITION | MF_GRAYED);
HiliteMenuItem(hwnd, pPreviewData->hMenu,
- ID_MENU_SELECTED, MF_BYCOMMAND | MF_HILITE);
+ 2, MF_BYPOSITION | MF_HILITE);
// GetMenuItemRect(hwnd, pPreviewData->hMenu,
-// ID_MENU_SELECTED, &pPreviewData->rcSelectedMenuItem);
-
+// 2, &pPreviewData->rcSelectedMenuItem);
AllocAndLoadString(&pPreviewData->lpInAct, hApplet, IDS_INACTWIN);
AllocAndLoadString(&pPreviewData->lpAct, hApplet, IDS_ACTWIN);
AllocAndLoadString(&pPreviewData->lpMessBox, hApplet, IDS_MESSBOX);
AllocAndLoadString(&pPreviewData->lpMessText, hApplet, IDS_MESSTEXT);
AllocAndLoadString(&pPreviewData->lpButText, hApplet, IDS_BUTTEXT);
+
+ theme = &pPreviewData->Theme;
+ LoadCurrentTheme(theme);
+
+ UpdatePreviewTheme(hwnd, pPreviewData, theme);
}
pPreviewData->rcInactiveCaption.left = pPreviewData->rcInactiveFrame.left + pPreviewData->cxEdge + pPreviewData->cySizeFrame + 1;
pPreviewData->rcInactiveCaption.top = pPreviewData->rcInactiveFrame.top + pPreviewData->cyEdge + pPreviewData->cySizeFrame + 1;
pPreviewData->rcInactiveCaption.right = pPreviewData->rcInactiveFrame.right - pPreviewData->cxEdge - pPreviewData->cySizeFrame - 1;
- pPreviewData->rcInactiveCaption.bottom = pPreviewData->rcInactiveCaption.top + pPreviewData->cyCaption;
+ pPreviewData->rcInactiveCaption.bottom = pPreviewData->rcInactiveCaption.top + pPreviewData->cyCaption - pPreviewData->cyBorder;
/* Calculate the inactive caption buttons rectangle */
pPreviewData->rcInactiveCaptionButtons.left = pPreviewData->rcInactiveCaption.right - 2 - 2 - 3 * 16;
pPreviewData->rcActiveCaption.left = pPreviewData->rcActiveFrame.left + pPreviewData->cxEdge + pPreviewData->cySizeFrame + 1;
pPreviewData->rcActiveCaption.top = pPreviewData->rcActiveFrame.top + pPreviewData->cxEdge + pPreviewData->cySizeFrame + 1;
pPreviewData->rcActiveCaption.right = pPreviewData->rcActiveFrame.right - pPreviewData->cxEdge - pPreviewData->cySizeFrame - 1;
- pPreviewData->rcActiveCaption.bottom = pPreviewData->rcActiveCaption.top + pPreviewData->cyCaption;
+ pPreviewData->rcActiveCaption.bottom = pPreviewData->rcActiveCaption.top + pPreviewData->cyCaption - pPreviewData->cyBorder;
/* Calculate the active caption buttons rectangle */
pPreviewData->rcActiveCaptionButtons.left = pPreviewData->rcActiveCaption.right - 2 - 2 - 3 * 16;
CalculateItemSize(pPreviewData);
}
-
static VOID
OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
{
HFONT hOldFont;
HDC hdc;
RECT rc;
+ THEME *theme;
+
+ theme = &pPreviewData->Theme;
hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &pPreviewData->rcDesktop, pPreviewData->hbrDesktop);
/* Inactive Window */
- DrawEdge(hdc, &pPreviewData->rcInactiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
- SetTextColor(hdc, pPreviewData->clrInactiveCaptionText);
- DrawCaptionTemp(NULL, hdc, &pPreviewData->rcInactiveCaption, pPreviewData->hCaptionFont,
- NULL, pPreviewData->lpInAct, DC_GRADIENT | DC_ICON | DC_TEXT);
- DrawCaptionButtons(hdc, &pPreviewData->rcInactiveCaption, TRUE, pPreviewData->cyCaption - 2);
+ MyDrawEdge(hdc, &pPreviewData->rcInactiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE, theme);
+ SetTextColor(hdc, theme->crColor[COLOR_INACTIVECAPTIONTEXT]);
+ MyDrawCaptionTemp(NULL, hdc, &pPreviewData->rcInactiveCaption, pPreviewData->hCaptionFont,
+ NULL, pPreviewData->lpInAct, DC_GRADIENT | DC_ICON | DC_TEXT, theme);
+ MyDrawCaptionButtons(hdc, &pPreviewData->rcInactiveCaption, TRUE, pPreviewData->cyCaption - 2, theme);
/* Active Window */
- DrawEdge(hdc, &pPreviewData->rcActiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
- SetTextColor(hdc, pPreviewData->clrActiveCaptionText);
- DrawCaptionTemp(NULL, hdc, &pPreviewData->rcActiveCaption, pPreviewData->hCaptionFont,
- NULL, pPreviewData->lpAct, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT);
- DrawCaptionButtons(hdc, &pPreviewData->rcActiveCaption, TRUE, pPreviewData->cyCaption - 2);
+ MyDrawEdge(hdc, &pPreviewData->rcActiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE, theme);
+ SetTextColor(hdc, theme->crColor[COLOR_CAPTIONTEXT]);
+ MyDrawCaptionTemp(NULL, hdc, &pPreviewData->rcActiveCaption, pPreviewData->hCaptionFont,
+ NULL, pPreviewData->lpAct, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT, theme);
+ MyDrawCaptionButtons(hdc, &pPreviewData->rcActiveCaption, TRUE, pPreviewData->cyCaption - 2, theme);
/* Draw the menu bar */
- DrawMenuBarTemp(hwnd, hdc, &pPreviewData->rcActiveMenuBar,
- pPreviewData->hMenu,
- pPreviewData->hMessageFont);
+ MyDrawMenuBarTemp(hwnd, hdc, &pPreviewData->rcActiveMenuBar,
+ pPreviewData->hMenu,
+ pPreviewData->hMenuFont, theme);
/* Draw the client area */
CopyRect(&rc, &pPreviewData->rcActiveClient);
- DrawEdge(hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
+ MyDrawEdge(hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_ADJUST, theme);
FillRect(hdc, &rc, pPreviewData->hbrWindow);
/* Draw the client text */
CopyRect(&rc, &pPreviewData->rcActiveClient);
rc.left += 4;
rc.top += 2;
- SetTextColor(hdc, pPreviewData->clrWindowText);
- hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
- DrawText(hdc, pPreviewData->lpWinTxt, lstrlen(pPreviewData->lpWinTxt), &rc, DT_LEFT);
+ SetTextColor(hdc, theme->crColor[COLOR_WINDOWTEXT]);
+ hOldFont = SelectObject(hdc, pPreviewData->hClientFont);
+ DrawText(hdc, pPreviewData->lpWinTxt, -1, &rc, DT_LEFT);
SelectObject(hdc, hOldFont);
/* Draw the scroll bar */
- DrawScrollbar(hdc, &pPreviewData->rcActiveScroll, pPreviewData->hbrScrollbar);
+ MyDrawScrollbar(hdc, &pPreviewData->rcActiveScroll, pPreviewData->hbrScrollbar, theme);
/* Dialog Window */
- DrawEdge(hdc, &pPreviewData->rcDialogFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
- SetTextColor(hdc, pPreviewData->clrActiveCaptionText);
- DrawCaptionTemp(NULL, hdc, &pPreviewData->rcDialogCaption, pPreviewData->hCaptionFont,
- NULL, pPreviewData->lpMessBox, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT);
- DrawCaptionButtons(hdc, &pPreviewData->rcDialogCaption, FALSE, pPreviewData->cyCaption - 2);
+ MyDrawEdge(hdc, &pPreviewData->rcDialogFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE, theme);
+ SetTextColor(hdc, theme->crColor[COLOR_WINDOW]);
+ MyDrawCaptionTemp(NULL, hdc, &pPreviewData->rcDialogCaption, pPreviewData->hCaptionFont,
+ NULL, pPreviewData->lpMessBox, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT, theme);
+ MyDrawCaptionButtons(hdc, &pPreviewData->rcDialogCaption, FALSE, pPreviewData->cyCaption - 2, theme);
/* Draw the dialog text */
CopyRect(&rc, &pPreviewData->rcDialogClient);
rc.left += 4;
rc.top += 2;
- SetTextColor(hdc, RGB(0,0,0));
+ SetTextColor(hdc, theme->crColor[COLOR_BTNTEXT]);
hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
- DrawText(hdc, pPreviewData->lpMessText, lstrlen(pPreviewData->lpMessText), &rc, DT_LEFT);
+ DrawText(hdc, pPreviewData->lpMessText, -1, &rc, DT_LEFT);
SelectObject(hdc, hOldFont);
/* Draw Button */
- DrawFrameControl(hdc, &pPreviewData->rcDialogButton, DFC_BUTTON, DFCS_BUTTONPUSH);
+ MyDrawFrameControl(hdc, &pPreviewData->rcDialogButton, DFC_BUTTON, DFCS_BUTTONPUSH, theme);
CopyRect(&rc, &pPreviewData->rcDialogButton);
- SetTextColor(hdc, pPreviewData->clrButtonText);
+ SetTextColor(hdc, theme->crColor[COLOR_BTNTEXT]);
hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
- DrawText(hdc, pPreviewData->lpButText, lstrlen(pPreviewData->lpButText), &rc, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
+ DrawText(hdc, pPreviewData->lpButText, -1, &rc, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
SelectObject(hdc, hOldFont);
EndPaint(hwnd, &ps);
if (PtInRect(&pPreviewData->rcActiveCaptionButtons, pt))
type = IDX_CAPTION_BUTTON;
- if (PtInRect(&pPreviewData->rcActiveMenuBar, pt))
- type = IDX_MENU;
-
// if (PtInRect(&pPreviewData->rcSelectedMenuItem, pt))
// type = IDX_SELECTION;
+ if (PtInRect(&pPreviewData->rcActiveMenuBar, pt))
+ type = IDX_MENU;
+
if (PtInRect(&pPreviewData->rcActiveClient, pt))
type = IDX_WINDOW;
}
break;
+ case PVM_UPDATETHEME:
+ UpdatePreviewTheme(hwnd, pPreviewData, (THEME *)lParam);
+ break;
+
default:
- DefWindowProc(hwnd,
- uMsg,
- wParam,
- lParam);
+ return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
-
- return TRUE;
+ return FALSE;
}
VOID
UnregisterPreviewControl(IN HINSTANCE hInstance)
{
- UnregisterClass(szPreviewWndClass,
- hInstance);
+ UnregisterClass(szPreviewWndClass, hInstance);
}