[ros-diffs] [ilardig] 48159: [DESK] - Implement theme quick preview. Patch by Katayama Hirofumi. See issue #5525 for more details.

ilardig at svn.reactos.org ilardig at svn.reactos.org
Wed Jul 21 12:20:20 UTC 2010


Author: ilardig
Date: Wed Jul 21 12:20:18 2010
New Revision: 48159

URL: http://svn.reactos.org/svn/reactos?rev=48159&view=rev
Log:
[DESK]
- Implement theme quick preview. Patch by Katayama Hirofumi.

See issue #5525 for more details.

Modified:
    trunk/reactos/dll/cpl/desk/appearance.c
    trunk/reactos/dll/cpl/desk/draw.c
    trunk/reactos/dll/cpl/desk/preview.c
    trunk/reactos/dll/cpl/desk/theme.c
    trunk/reactos/dll/cpl/desk/theme.h

Modified: trunk/reactos/dll/cpl/desk/appearance.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/desk/appearance.c?rev=48159&r1=48158&r2=48159&view=diff
==============================================================================
--- trunk/reactos/dll/cpl/desk/appearance.c [iso-8859-1] (original)
+++ trunk/reactos/dll/cpl/desk/appearance.c [iso-8859-1] Wed Jul 21 12:20:18 2010
@@ -36,7 +36,7 @@
 	g->hbmpColor[0] = g->hbmpColor[1] = g->hbmpColor[2] = NULL;
 	g->bInitializing = FALSE;
 
-	TemplateCount = LoadThemeTemplates(strSelectedStyle);
+	TemplateCount = LoadThemePresetEntries(strSelectedStyle);
 
 	hwndCombo = GetDlgItem(hwndDlg, IDC_APPEARANCE_COLORSCHEME);
 	g->ThemeId = -1;
@@ -105,7 +105,7 @@
 						g->ThemeId = -1;	/* Customized */
 						SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_SETCURSEL, (WPARAM)-1, 0);
 						SetDlgItemText(hwndDlg, IDC_APPEARANCE_COLORSCHEME, TEXT(""));
-						/* SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme); */
+						SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme);
 					}
 					break;
 
@@ -119,7 +119,7 @@
 						g->ThemeId = -1;	/* Customized */
 						SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_SETCURSEL, (WPARAM)-1, 0);
 						SetDlgItemText(hwndDlg, IDC_APPEARANCE_COLORSCHEME, TEXT(""));
-						/* SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme); */
+						SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->Theme);
 					}
 					break;
 
@@ -134,7 +134,7 @@
 						{
 							g->Theme = Theme;
 							g->ThemeId = ThemeId;
-							/* SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&Theme); */
+							SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&Theme);
 						}
 					}
 					break;

Modified: trunk/reactos/dll/cpl/desk/draw.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/desk/draw.c?rev=48159&r1=48158&r2=48159&view=diff
==============================================================================
--- trunk/reactos/dll/cpl/desk/draw.c [iso-8859-1] (original)
+++ trunk/reactos/dll/cpl/desk/draw.c [iso-8859-1] Wed Jul 21 12:20:18 2010
@@ -7,13 +7,11 @@
  * PROGRAMMERS:     Katayama Hirofumi MZ <katayama.hirofumi.mz at gmail.com>
  */
 
-/* #define NTOS_MODE_USER */
-/* #define WIN32_NO_STATUS */
 #include "desk.h"
 #include "theme.h"
 #include "draw.h"
-/* #include <ndk/ntndk.h> */
-/* #include <win32k/ntuser.h> */
+
+#define MENU_BAR_ITEMS_SPACE (12)
 
 /******************************************************************************/
 
@@ -43,6 +41,20 @@
     COLOR_BTNSHADOW,    COLOR_3DDKSHADOW,  COLOR_BTNHIGHLIGHT, -1,
     COLOR_3DLIGHT,      COLOR_3DDKSHADOW,  COLOR_BTNHIGHLIGHT, -1,
     -1,                 COLOR_3DDKSHADOW,  COLOR_BTNHIGHLIGHT, -1
+};
+
+static const signed char LTRBOuterMono[] = {
+    -1,           COLOR_WINDOWFRAME, COLOR_WINDOWFRAME, COLOR_WINDOWFRAME,
+    COLOR_WINDOW, COLOR_WINDOWFRAME, COLOR_WINDOWFRAME, COLOR_WINDOWFRAME,
+    COLOR_WINDOW, COLOR_WINDOWFRAME, COLOR_WINDOWFRAME, COLOR_WINDOWFRAME,
+    COLOR_WINDOW, COLOR_WINDOWFRAME, COLOR_WINDOWFRAME, COLOR_WINDOWFRAME,
+};
+
+static const signed char LTRBInnerMono[] = {
+    -1, -1,           -1,           -1,
+    -1, COLOR_WINDOW, COLOR_WINDOW, COLOR_WINDOW,
+    -1, COLOR_WINDOW, COLOR_WINDOW, COLOR_WINDOW,
+    -1, COLOR_WINDOW, COLOR_WINDOW, COLOR_WINDOW,
 };
 
 static BOOL
@@ -144,6 +156,24 @@
 	{
 		MoveToEx(hdc, InnerRect.right-2, InnerRect.top+RTpenplus, NULL);
 		LineTo(hdc, InnerRect.right-2, InnerRect.bottom-RBpenplus);
+	}
+
+	if (uFlags & BF_ADJUST)
+	{
+		int add = (LTRBInnerMono[uType & (BDR_INNER|BDR_OUTER)] != -1 ? 1 : 0)
+					  + (LTRBOuterMono[uType & (BDR_INNER|BDR_OUTER)] != -1 ? 1 : 0);
+
+		if(uFlags & BF_LEFT)
+			InnerRect.left += add;
+		if(uFlags & BF_RIGHT)
+			InnerRect.right -= add;
+		if(uFlags & BF_TOP)
+			InnerRect.top += add;
+		if(uFlags & BF_BOTTOM)
+			InnerRect.bottom -= add;
+
+		if(uFlags & BF_ADJUST)
+			*rc = InnerRect;
 	}
 
 	/* Cleanup */
@@ -409,8 +439,69 @@
 BOOL
 MyDrawCaptionTemp(HWND hwnd, HDC hdc, const RECT *rect, HFONT hFont, HICON hIcon, LPCWSTR str, UINT uFlags, THEME *theme)
 {
-	/* FIXME */
-	return DrawCaptionTemp(hwnd, hdc, rect, hFont, hIcon, str, uFlags);
+	ULONG Height;
+	UINT VCenter, Padding;
+	LONG ButtonWidth;
+	HBRUSH hbr;
+	HGDIOBJ hFontOld;
+    RECT rc;
+
+	Height = theme->Size[SIZE_CAPTION_Y] - 1;
+	VCenter = (rect->bottom - rect->top) / 2;
+	Padding = VCenter - (Height / 2);
+
+	ButtonWidth = theme->Size[SIZE_SIZE_X] - 2;
+
+	if (uFlags & DC_GRADIENT)
+	{
+		GRADIENT_RECT gcap = {0, 1};
+		TRIVERTEX vert[2];
+		COLORREF Colors[2];
+
+		Colors[0] = theme->crColor[((uFlags & DC_ACTIVE) ?
+			COLOR_ACTIVECAPTION : COLOR_INACTIVECAPTION)];
+		Colors[1] = theme->crColor[((uFlags & DC_ACTIVE) ?
+			COLOR_GRADIENTACTIVECAPTION : COLOR_GRADIENTINACTIVECAPTION)];
+
+		vert[0].x = rect->left;
+		vert[0].y = rect->top;
+		vert[0].Red = (WORD)Colors[0]<<8;
+		vert[0].Green = (WORD)Colors[0] & 0xFF00;
+		vert[0].Blue = (WORD)(Colors[0]>>8) & 0xFF00;
+		vert[0].Alpha = 0;
+
+		vert[1].x = rect->right;
+		vert[1].y = rect->bottom;
+		vert[1].Red = (WORD)Colors[1]<<8;
+		vert[1].Green = (WORD)Colors[1] & 0xFF00;
+		vert[1].Blue = (WORD)(Colors[1]>>8) & 0xFF00;
+		vert[1].Alpha = 0;
+
+		GradientFill(hdc, vert, 2, &gcap, 1, GRADIENT_FILL_RECT_H);
+	}
+	else
+	{
+		if (uFlags & DC_ACTIVE)
+			hbr = CreateSolidBrush(theme->crColor[COLOR_ACTIVECAPTION]);
+		else
+			hbr = CreateSolidBrush(theme->crColor[COLOR_INACTIVECAPTION]);
+		FillRect(hdc, rect, hbr);
+		DeleteObject(hbr);
+	}
+
+	hFontOld = SelectObject(hdc, hFont);
+	SetBkMode(hdc, TRANSPARENT);
+	if (uFlags & DC_ACTIVE)
+		SetTextColor(hdc, theme->crColor[COLOR_CAPTIONTEXT]);
+	else
+		SetTextColor(hdc, theme->crColor[COLOR_INACTIVECAPTIONTEXT]);
+	rc.left = rect->left + 2;
+	rc.top = rect->top;
+	rc.right = rect->right;
+	rc.bottom = rect->bottom;
+	DrawTextW(hdc, str, -1, &rc, DT_SINGLELINE | DT_VCENTER);
+	SelectObject(hdc, hFontOld);
+	return TRUE;
 }
 
 /******************************************************************************/
@@ -418,6 +509,99 @@
 DWORD
 MyDrawMenuBarTemp(HWND Wnd, HDC DC, LPRECT Rect, HMENU Menu, HFONT Font, THEME *theme)
 {
-	/* FIXME */
-	return DrawMenuBarTemp(Wnd, DC, Rect, Menu, Font);
-}
+	HBRUSH hbr;
+	HPEN hPen;
+	HGDIOBJ hPenOld, hFontOld;
+	BOOL flat_menu;
+	INT i, bkgnd, x;
+	RECT rect;
+	WCHAR Text[128];
+	UINT uFormat = DT_CENTER | DT_VCENTER | DT_SINGLELINE;
+
+	flat_menu = theme->bFlatMenus;
+
+	if (flat_menu)
+		hbr = CreateSolidBrush(theme->crColor[COLOR_MENUBAR]);
+	else
+		hbr = CreateSolidBrush(theme->crColor[COLOR_MENU]);
+	FillRect(DC, Rect, hbr);
+	DeleteObject(hbr);
+
+	hPen = CreatePen(PS_SOLID, 0, theme->crColor[COLOR_3DFACE]);
+	hPenOld = SelectObject(DC, hPen);
+	MoveToEx(DC, Rect->left, Rect->bottom - 1, NULL);
+	LineTo(DC, Rect->right, Rect->bottom - 1);
+	SelectObject(DC, hPenOld);
+	DeleteObject(hPen);
+
+    bkgnd = (flat_menu ? COLOR_MENUBAR : COLOR_MENU);
+	x = Rect->left;
+	hFontOld = SelectObject(DC, Font);
+	for(i = 0; i < 3; i++)
+	{
+		GetMenuStringW(Menu, i, Text, 128, MF_BYPOSITION);
+
+		rect.left = x;
+		rect.top = Rect->top;
+		DrawTextW(DC, Text, -1, &rect, DT_SINGLELINE | DT_CALCRECT);
+
+	    rect.bottom = Rect->bottom;
+		rect.right += MENU_BAR_ITEMS_SPACE;
+		x += rect.right - rect.left;
+
+		if (i == 2)
+		{
+			if (flat_menu)
+			{
+				SetTextColor(DC, theme->crColor[COLOR_HIGHLIGHTTEXT]);
+				SetBkColor(DC, theme->crColor[COLOR_HIGHLIGHT]);
+
+				InflateRect (&rect, -1, -1);
+				hbr = CreateSolidBrush(theme->crColor[COLOR_MENUHILIGHT]);
+				FillRect(DC, &rect, hbr);
+				DeleteObject(hbr);
+
+				InflateRect (&rect, 1, 1);
+				hbr = CreateSolidBrush(theme->crColor[COLOR_HIGHLIGHT]);
+				FrameRect(DC, &rect, hbr);
+				DeleteObject(hbr);
+			}
+			else
+			{
+				SetTextColor(DC, theme->crColor[COLOR_MENUTEXT]);
+				SetBkColor(DC, theme->crColor[COLOR_MENU]);
+				DrawEdge(DC, &rect, BDR_SUNKENOUTER, BF_RECT);
+			}
+		}
+		else
+		{
+			if (i == 1)
+				SetTextColor(DC, theme->crColor[COLOR_GRAYTEXT]);
+			else
+				SetTextColor(DC, theme->crColor[COLOR_MENUTEXT]);
+
+			SetBkColor(DC, theme->crColor[bkgnd]);
+			hbr = CreateSolidBrush(theme->crColor[bkgnd]);
+			FillRect(DC, &rect, hbr);
+			DeleteObject(hbr);
+		}
+
+		SetBkMode(DC, TRANSPARENT);
+
+		rect.left += MENU_BAR_ITEMS_SPACE / 2;
+		rect.right -= MENU_BAR_ITEMS_SPACE / 2;
+
+		if (i == 1)
+		{
+			++rect.left; ++rect.top; ++rect.right; ++rect.bottom;
+			SetTextColor(DC, RGB(0xff, 0xff, 0xff));
+			DrawTextW(DC, Text, -1, &rect, uFormat);
+			--rect.left; --rect.top; --rect.right; --rect.bottom;
+			SetTextColor(DC, RGB(0x80, 0x80, 0x80));
+		}
+		DrawTextW(DC, Text, -1, &rect, uFormat);
+	}
+	SelectObject(DC, hFontOld);
+
+	return TRUE;
+}

Modified: trunk/reactos/dll/cpl/desk/preview.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/desk/preview.c?rev=48159&r1=48158&r2=48159&view=diff
==============================================================================
--- trunk/reactos/dll/cpl/desk/preview.c [iso-8859-1] (original)
+++ trunk/reactos/dll/cpl/desk/preview.c [iso-8859-1] Wed Jul 21 12:20:18 2010
@@ -263,8 +263,8 @@
     /* Inactive Window */
     MyDrawEdge(hdc, &pPreviewData->rcInactiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE, theme);
     SetTextColor(hdc, theme->crColor[COLOR_INACTIVECAPTIONTEXT]);
-    DrawCaptionTemp(NULL, hdc, &pPreviewData->rcInactiveCaption,  pPreviewData->hCaptionFont,
-                    NULL, pPreviewData->lpInAct, DC_GRADIENT | DC_ICON | DC_TEXT);
+    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 */
@@ -290,7 +290,7 @@
     rc.top += 2;
     SetTextColor(hdc, theme->crColor[COLOR_WINDOWTEXT]);
     hOldFont = SelectObject(hdc, pPreviewData->hCaptionFont);   /* FIXME: client text is not caption text */
-    DrawText(hdc, pPreviewData->lpWinTxt, lstrlen(pPreviewData->lpWinTxt), &rc, DT_LEFT);
+    DrawText(hdc, pPreviewData->lpWinTxt, -1, &rc, DT_LEFT);
     SelectObject(hdc, hOldFont);
 
     /* Draw the scroll bar */
@@ -307,9 +307,9 @@
     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 */
@@ -317,7 +317,7 @@
     CopyRect(&rc, &pPreviewData->rcDialogButton);
     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);

Modified: trunk/reactos/dll/cpl/desk/theme.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/desk/theme.c?rev=48159&r1=48158&r2=48159&view=diff
==============================================================================
--- trunk/reactos/dll/cpl/desk/theme.c [iso-8859-1] (original)
+++ trunk/reactos/dll/cpl/desk/theme.c [iso-8859-1] Wed Jul 21 12:20:18 2010
@@ -10,7 +10,7 @@
 #include "desk.h"
 #include "theme.h"
 
-static BOOL g_TemplateLoaded = FALSE;
+static BOOL g_PresetLoaded = FALSE;
 static INT g_TemplateCount = 0;
 
 static INT g_ColorList[NUM_COLORS];
@@ -141,8 +141,8 @@
 	DWORD dwType, dwLength;
 	BOOL Ret = FALSE;
 
-	if (!g_TemplateLoaded)
-		LoadThemeTemplates(strSelectedStyle);
+	if (!g_PresetLoaded)
+		LoadThemePresetEntries(strSelectedStyle);
 
 	if (ThemeId == -1)
 		return FALSE;
@@ -342,7 +342,7 @@
 	return FALSE;
 }
 
-INT LoadThemeTemplates(LPTSTR pszSelectedStyle)
+INT LoadThemePresetEntries(LPTSTR pszSelectedStyle)
 {
 	HKEY hkNewSchemes, hkScheme, hkSizes, hkSize;
 	FILETIME ftLastWriteTime;
@@ -362,7 +362,7 @@
 		RegQueryValueEx(hkNewSchemes, g_SelectedStyle, NULL, &dwType, (LPBYTE)pszSelectedStyle, &dwLength);
 
 		/* Check if already loaded */
-		if (g_TemplateLoaded)
+		if (g_PresetLoaded)
 		{
 			RegCloseKey(hkNewSchemes);
 			return g_TemplateCount;
@@ -406,7 +406,7 @@
 			dwLength = MAX_TEMPLATENAMELENTGH;
 		}
 		RegCloseKey(hkNewSchemes);
-		g_TemplateLoaded = TRUE;
+		g_PresetLoaded = TRUE;
 		g_TemplateCount = iTemplateIndex;
 	}
 	return iTemplateIndex;

Modified: trunk/reactos/dll/cpl/desk/theme.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/desk/theme.h?rev=48159&r1=48158&r2=48159&view=diff
==============================================================================
--- trunk/reactos/dll/cpl/desk/theme.h [iso-8859-1] (original)
+++ trunk/reactos/dll/cpl/desk/theme.h [iso-8859-1] Wed Jul 21 12:20:18 2010
@@ -86,4 +86,4 @@
 BOOL LoadThemeFromReg(THEME* theme, INT ThemeId);
 VOID ApplyTheme(THEME* theme, INT ThemeId);
 BOOL SaveTheme(THEME* theme, LPCTSTR strLegacyName);
-INT LoadThemeTemplates(LPTSTR pszSelectedStyle);
+INT LoadThemePresetEntries(LPTSTR pszSelectedStyle);




More information about the Ros-diffs mailing list