// XTPTaskPanelPaintManager.cpp : implementation of the CXTPTaskPanelPaintManager class.
//
// This file is a part of the XTREME TASKPANEL MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Resource.h"

#include "Common/XTPVC80Helpers.h"
#include "Common/XTPDrawHelpers.h"
#include "Common/XTPWinThemeWrapper.h"
#include "Common/XTPImageManager.h"
#include "Common/XTPResourceManager.h"
#include "Common/XTPResourceImage.h"
#include "Common/XTPSystemHelpers.h"
#include "Common/XTPColorManager.h"

#include "XTPTaskPanelDefines.h"
#include "XTPTaskPanel.h"
#include "XTPTaskPanelItem.h"
#include "XTPTaskPanelGroup.h"
#include "XTPTaskPanelGroupItem.h"
#include "XTPTaskPanelItems.h"
#include "XTPTaskPanelPaintManager.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#define new DEBUG_NEW
#endif

#define NORMCOLOR(a) a < 0 ? 0: a > 255 ? 255 : a
#define HIGHLIGHT_OFFICE2003 2
#define COLORREF_TRANSPARENT 0x1FFFFFFF

const CRect CXTPTaskPanelPaintManager::rectDefault(CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT);

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CXTPTaskPanelPaintManager::CXTPTaskPanelPaintManager()
{
	m_bEmulateEplorerTheme = TRUE;
	m_bBoldCaption = TRUE;
	m_bOfficeHighlight = FALSE;
	m_bInvertDragRect = FALSE;
	m_bCaptionScrollButton = FALSE;

	m_bUseStandardItemsFont = TRUE;
	m_bUseStandardCaptionFont = TRUE;
	m_eGripper = xtpTaskPanelGripperPlain;

	m_hGripperNormal = m_hGripperSpecial = 0;

	m_rcGroupOuterMargins.SetRect(0, 0, 0, 0);
	m_rcGroupInnerMargins.SetRect(11, 8, 11, 8);
	m_rcItemOuterMargins.SetRect(0, 0, 0, 0);
	m_rcItemInnerMargins.SetRect(2, 2, 2, 2);
	m_rcImageLayoutIconPadding.SetRect(6, 6, 6, 6);
	m_rcItemIconPadding.SetRect(0, 0, 0, 0);
	m_rcGroupIconPadding.SetRect(0, 0, 0, 0);

	m_rcControlMargins.SetRect(12, 12, 12, 12);
	m_nGroupSpacing = 15;
	m_bEmbossedDisabledText = FALSE;

	ZeroMemory(m_bmpGrippers, sizeof(m_bmpGrippers));

	m_bUseBitmapGrippers = FALSE;
	m_bOfficeBorder = FALSE;
	m_bLeftRoundedCorner = m_bRightRoundedCorner = FALSE;
	m_nCaptionHeight = 0;

	m_nItemTextFormat = DT_WORDBREAK | DT_NOPREFIX;
	m_nCaptionTextFormat = DT_SINGLELINE | DT_LEFT | DT_END_ELLIPSIS | DT_VCENTER | DT_NOPREFIX;
}

XTP_TASKPANEL_GROUPCOLORS* CXTPTaskPanelPaintManager::GetGroupColors(CXTPTaskPanelGroup* pGroup)
{
	return GetGroupColors(pGroup->IsSpecialGroup());
}

void CXTPTaskPanelPaintManager::FreeBitmaps()
{
	for (int i = 0; i < 8; i++)
	{
		if (m_bmpGrippers[i])
		{
			DeleteObject(m_bmpGrippers[i]);
			m_bmpGrippers[i] = 0;
		}
	}
}

CFont* CXTPTaskPanelPaintManager::GetItemFont(CXTPTaskPanelItem* pItem)
{
	if (!pItem)
		return &m_fntIcon;

	if (pItem->m_fntItem.GetSafeHandle())
		return &pItem->m_fntItem;

	if (pItem->GetType() == xtpTaskItemTypeGroup)
		return &m_fntCaption;

	BOOL bBold = ((CXTPTaskPanelGroupItem*)pItem)->IsBold();

	return (((CXTPTaskPanelGroupItem*)pItem)->IsItemHot() && (pItem->GetTaskPanel()->GetHotTrackStyle() == xtpTaskPanelHighlightText)) ?
		(bBold ? &m_fntIconHotBold: &m_fntIconHot) : (bBold ? &m_fntIconBold : &m_fntIcon);
}

CXTPTaskPanelPaintManager::~CXTPTaskPanelPaintManager()
{
	if (m_hGripperNormal) DestroyIcon(m_hGripperNormal);
	if (m_hGripperSpecial) DestroyIcon(m_hGripperSpecial);
	FreeBitmaps();
}

CPoint CXTPTaskPanelPaintManager::GetHighlightOffset(CXTPTaskPanelGroupItem* pItem)
{
	if (pItem->IsItemSelected() && !m_bOfficeHighlight)
		return CPoint(1, 1);
	return CPoint(0, 0);
}

void CXTPTaskPanelPaintManager::ConvertToHSL(COLORREF clr, double& h, double& s, double& l)
{
	double r = (double)GetRValue(clr)/255;
	double g = (double)GetGValue(clr)/255;
	double b = (double)GetBValue(clr)/255;

	double maxcolor = __max(r, __max(g, b));
	double mincolor = __min(r, __min(g, b));

	l = (maxcolor + mincolor)/2;

	if (maxcolor == mincolor)
	{
		h = 0;
		s = 0;
	}
	else
	{
		if (l < 0.5)
			s = (maxcolor-mincolor)/(maxcolor + mincolor);
		else
			s = (maxcolor-mincolor)/(2.0-maxcolor-mincolor);

		if (r == maxcolor)
			h = (g-b)/(maxcolor-mincolor);
		else if (g == maxcolor)
			h = 2.0+(b-r)/(maxcolor-mincolor);
		else
			h = 4.0+(r-g)/(maxcolor-mincolor);

		h /= 6.0;
		if (h < 0.0) h += 1;
	}
}

double CXTPTaskPanelPaintManager::ConvertHueToRGB(double temp1, double temp2, double temp3)
{
	if (temp3 < 0)
		temp3 = temp3 + 1.0;
	if (temp3 > 1)
		temp3 = temp3-1.0;

	if (6.0*temp3 < 1)
		return (temp1+(temp2-temp1)*temp3 * 6.0);

	else if (2.0*temp3 < 1)
		return temp2;

	else if (3.0*temp3 < 2.0)
		return (temp1+(temp2-temp1)*((2.0/3.0)-temp3)*6.0);

	return temp1;
}

COLORREF  CXTPTaskPanelPaintManager::ConvertFromHSL(double h, double s, double l)
{
	double r, g, b;
	double temp1, temp2;

	if (s == 0)
	{
		r = g = b = l;
	}
	else
	{
		if (l < 0.5)
			temp2 = l*(1.0 + s);
		else
			temp2 = l + s-l*s;

		temp1 = 2.0*l-temp2;

		r = ConvertHueToRGB(temp1, temp2, h + 1.0/3.0);
		g = ConvertHueToRGB(temp1, temp2, h);
		b = ConvertHueToRGB(temp1, temp2, h-1.0/3.0);
	}

	return RGB((BYTE)(r * 255), (BYTE)(g * 255), (BYTE)(b * 255));
}

void CXTPTaskPanelPaintManager::Triangle(CDC* pDC, CPoint pt0, CPoint pt1, CPoint pt2, COLORREF clr)
{
	CXTPPenDC pen (*pDC, clr);
	CXTPBrushDC brush (*pDC, clr);

	CPoint pts[3];
	pts[0] = pt0;
	pts[1] = pt1;
	pts[2] = pt2;
	pDC->Polygon(pts, 3);
}

void CXTPTaskPanelPaintManager::DrawScrollArrow(CDC* pDC, CPoint pt0, CPoint pt1, CPoint pt2, BOOL bEnabled)
{
	if (bEnabled)
	{
		Triangle(pDC, pt0, pt1, pt2, 0);
	}
	else
	{
		CPoint pt(1, 1);
		Triangle(pDC, pt0 + pt, pt1 + pt, pt2 + pt, GetXtremeColor(COLOR_3DHIGHLIGHT));
		Triangle(pDC, pt0, pt1, pt2, GetXtremeColor(COLOR_3DSHADOW));
	}
}


void CXTPTaskPanelPaintManager::DrawScrollButton(CDC* pDC, CXTPTaskPanelScrollButton* pScrollButton)
{
	if (!pScrollButton->IsVisible())
		return;

	CRect rc = pScrollButton->rcButton;

	if (m_bOfficeHighlight && !m_bCaptionScrollButton)
	{
		COLORREF clrNormal = GetGroupColors(pScrollButton->pGroupScroll)->clrClient.clrLight;
		COLORREF clrBrush = pScrollButton->bPressed ? (COLORREF)m_clrHighlightPressed :
			pScrollButton->bHot ? (COLORREF)m_clrHighlightHot : (clrNormal == COLORREF_TRANSPARENT ? (COLORREF)m_clrBackground : clrNormal);

		Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, clrBrush);
	}
	else
	{
		pDC->FillSolidRect(rc, GetXtremeColor(COLOR_3DFACE));

		if (!pScrollButton->bPressed)
			pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DHIGHLIGHT), GetXtremeColor(COLOR_3DSHADOW));
		else
			pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DSHADOW), GetXtremeColor(COLOR_3DHIGHLIGHT));
	}

	CPoint pt = rc.CenterPoint();

	if (!pScrollButton->bScrollUp)
		DrawScrollArrow(pDC, CPoint(pt.x - 5, pt.y - 2), CPoint(pt.x - 1, pt.y + 2), CPoint(pt.x + 3, pt.y - 2), pScrollButton->bEnabled);
	else
		DrawScrollArrow(pDC, CPoint(pt.x - 5, pt.y + 1), CPoint(pt.x - 1, pt.y - 3), CPoint(pt.x + 3, pt.y + 1), pScrollButton->bEnabled);
}


void CXTPTaskPanelPaintManager::CreateGripperIcon(HICON& hIcon, UINT nIDResource, COLORREF clrGripperBack)
{
	if (hIcon)
	{
		DestroyIcon(hIcon);
		hIcon = 0;
	}

	CBitmap bmpGripper;

	double hueBack, satBack, lumBack;
	ConvertToHSL(clrGripperBack, hueBack, satBack, lumBack);


	CBitmap bmp;
	if (XTPResourceManager()->LoadBitmap(&bmp, nIDResource))
	{
		BITMAP bmpInfo;
		bmp.GetBitmap(&bmpInfo);

		CWindowDC dc(CWnd::GetDesktopWindow());

		if (bmpGripper.CreateCompatibleBitmap(&dc, bmpInfo.bmWidth, m_nCaptionHeight))
		{
			CXTPCompatibleDC dcTemplate(&dc, &bmp);
			CXTPCompatibleDC dcGripper(&dc, &bmpGripper);

			COLORREF clrTemplateBack = dcTemplate.GetPixel(0, 0);

			double hueTrans, satTrans, lumTrans;
			ConvertToHSL(clrTemplateBack, hueTrans, satTrans, lumTrans);

			for (int x = 0; x < bmpInfo.bmWidth; x++)
			for (int y = 0; y < bmpInfo.bmWidth; y++)
			{
				COLORREF clrTemplate = dcTemplate.GetPixel(x, y);

				if (clrTemplate == clrTemplateBack)
				{
					clrTemplate = RGB(0, 0xFF, 0);
				}
				else
				{

					double huePixel, satPixel, lumPixel;
					ConvertToHSL(clrTemplate, huePixel, satPixel, lumPixel);

					double fLumOffset = lumPixel / lumTrans;
					if (lumPixel <= 0.9 || lumBack > 0.9)
					{
						lumPixel = min(1.0, lumBack * fLumOffset);
					}

					clrTemplate = ConvertFromHSL(hueBack, satBack, lumPixel);
				}

				dcGripper.SetPixel(x, y, clrTemplate);
			}
		}


		CImageList il;
		il.Create(bmpInfo.bmWidth, bmpInfo.bmHeight, ILC_COLOR24 | ILC_MASK, 0, 1);

		il.Add(&bmpGripper, RGB(0, 0xFF, 0));

		hIcon = il.ExtractIcon(0);
	}



}

void CXTPTaskPanelPaintManager::PremultplyAlpha(HBITMAP& bmp)
{
	HBITMAP hBitmap = bmp;
	bmp = CXTPImageManagerIcon::PreMultiplyAlphaBitmap(hBitmap);
	DeleteObject(hBitmap);
}

void CXTPTaskPanelPaintManager::CreateGripperBitmaps()
{
	m_bUseBitmapGrippers = FALSE;

	XTPCurrentSystemTheme systemTheme = XTPColorManager()->GetCurrentSystemTheme();

	if (systemTheme != xtpSystemThemeUnknown)
	{
		WCHAR pszThemeFileName[MAX_PATH];
		pszThemeFileName[0] = 0;
		CString strShellPath;

		CXTPWinThemeWrapper theme;
		if (SUCCEEDED(theme.GetCurrentThemeName(pszThemeFileName, MAX_PATH, NULL, MAX_PATH, NULL, 0))
			&& wcsstr(WCSLWR_S(pszThemeFileName, MAX_PATH), L"luna.msstyles"))
		{
			CString strThemeFileName(pszThemeFileName);
			strShellPath = strThemeFileName.Left(strThemeFileName.ReverseFind(_T('\\')) + 1);
		}
		else
		{
			CString strThemeFileName;
			if (GetWindowsDirectory(strThemeFileName.GetBufferSetLength(MAX_PATH), MAX_PATH) > 0)
			{
				strThemeFileName.ReleaseBuffer();
				strShellPath = strThemeFileName + _T("\\Resources\\Themes\\Luna\\");
			}

		}
		CString strColorName = systemTheme == xtpSystemThemeOlive ?
			_T("Homestead"): systemTheme == xtpSystemThemeSilver ? _T("Metallic") : _T("NormalColor");

		strShellPath = strShellPath + _T("shell\\") + strColorName + _T("\\shellstyle.dll");

		HMODULE hLib = LoadLibraryEx(strShellPath, 0, LOAD_LIBRARY_AS_DATAFILE);
		if (hLib)
		{

			FreeBitmaps();

			m_bUseBitmapGrippers = TRUE;

			for (int i = 0; i < 8; i++)
			{
				m_bmpGrippers[i] = (HBITMAP)LoadImage(hLib, MAKEINTRESOURCE(100 + i), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);

				if (m_bmpGrippers[i] && m_bUseBitmapGrippers)
				{
					PremultplyAlpha(m_bmpGrippers[i]);
				}
				else m_bUseBitmapGrippers = FALSE;
			}
			FreeLibrary(hLib);
		}

	}

	if (!m_bUseBitmapGrippers)
	{
		CreateGripperIcon(m_hGripperSpecial, XTP_IDB_TASKPANEL_GRIPPER_SPECIAL, m_groupSpecial.clrHead.clrDark);
		CreateGripperIcon(m_hGripperNormal, XTP_IDB_TASKPANEL_GRIPPER, m_groupNormal.clrHead.clrDark);
	}
}

void CXTPTaskPanelPaintManager::DrawCaptionGripperSigns(CDC* pDC, CPoint pt, COLORREF clr, BOOL bExpanded)
{
	CXTPPenDC  pen(*pDC, clr);

	if (bExpanded)
	{
		pDC->MoveTo(pt.x - 3, pt.y - 2); pDC->LineTo(pt.x, pt.y - 3- 2); pDC->LineTo(pt.x + 4, pt.y + 1- 2);
		pDC->MoveTo(pt.x - 2, pt.y - 2); pDC->LineTo(pt.x, pt.y - 2- 2); pDC->LineTo(pt.x + 3, pt.y + 1- 2);

		pDC->MoveTo(pt.x - 3, pt.y + 2); pDC->LineTo(pt.x, pt.y - 3 + 2); pDC->LineTo(pt.x + 4, pt.y + 1 + 2);
		pDC->MoveTo(pt.x - 2, pt.y + 2); pDC->LineTo(pt.x, pt.y - 2 + 2); pDC->LineTo(pt.x + 3, pt.y + 1 + 2);
	}
	else
	{
		pDC->MoveTo(pt.x - 3, pt.y - 4); pDC->LineTo(pt.x, pt.y + 3- 4); pDC->LineTo(pt.x + 4, pt.y - 1- 4);
		pDC->MoveTo(pt.x - 2, pt.y - 4); pDC->LineTo(pt.x, pt.y + 2- 4); pDC->LineTo(pt.x + 3, pt.y - 1- 4);

		pDC->MoveTo(pt.x - 3, pt.y + 0); pDC->LineTo(pt.x, pt.y + 3 + 0); pDC->LineTo(pt.x + 4, pt.y - 1 + 0);
		pDC->MoveTo(pt.x - 2, pt.y + 0); pDC->LineTo(pt.x, pt.y + 2 + 0); pDC->LineTo(pt.x + 3, pt.y - 1 + 0);
	}
}


CRect CXTPTaskPanelPaintManager::DrawCaptionGripperBitmap(CDC* pDC, CXTPTaskPanelGroup* pGroup, BOOL bExpanded, BOOL bHot, CRect rc)
{

	int nTop = max(rc.top, rc.CenterPoint().y - 10);
	CRect rcGripper(rc.right - 3 - 20, nTop, rc.right - 3, nTop + 20);

	if (m_bUseBitmapGrippers)
	{
		int nIndex = pGroup->IsSpecialGroup() ? 4 : 0;
		nIndex += bExpanded ? 0 : 2;
		nIndex += bHot ? 1 : 0;

		CXTPCompatibleDC dcGripper(NULL, CBitmap::FromHandle(m_bmpGrippers[nIndex]));

		if (XTPDrawHelpers()->m_pfnAlphaBlend)
		{
			BITMAP bmpInfo;
			GetObject(m_bmpGrippers[nIndex], sizeof(BITMAP), &bmpInfo);

			BLENDFUNCTION bf = {AC_SRC_OVER, 0, 255, 1};
			XTPDrawHelpers()->m_pfnAlphaBlend(pDC->GetSafeHdc(), rcGripper.left, rcGripper.top, bmpInfo.bmWidth, bmpInfo.bmHeight, dcGripper, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, bf);
		}

	}
	else
	{

		HICON hIcon = pGroup->IsSpecialGroup() ? m_hGripperSpecial : m_hGripperNormal;

		pDC->DrawState(rcGripper.TopLeft(), CSize(19, 19), hIcon, DST_ICON, (CBrush*)NULL);

		XTP_TASKPANEL_GROUPCOLORS* pGroupColors = GetGroupColors(pGroup);

		DrawCaptionGripperSigns(pDC, CPoint(rcGripper.CenterPoint().x - 1, rcGripper.CenterPoint().y), bHot ? pGroupColors->clrHeadTextHot : pGroupColors->clrHeadTextNormal, bExpanded);

	}


	rc.right = rcGripper.left;
	return rc;
}

int CXTPTaskPanelPaintManager::GetCaptionGripperWidth(CXTPTaskPanelGroup* pGroup, CRect rc)
{
	if (!pGroup->IsExpandable())
		return 0;

	if (rc.Width() < 20 + 6)
		return 0;

	if (m_eGripper == xtpTaskPanelGripperBitmap)
		return 23;

	if (m_eGripper == xtpTaskPanelGripperPlain)
		return 23;

	if (m_eGripper == xtpTaskPanelGripperTriangle)
		return 19;

	return 0;
}


CRect CXTPTaskPanelPaintManager::DrawCaptionGripper(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	if (!pGroup->IsExpandable())
		return rc;

	if (rc.Width() < 20 + 6)
		return rc;


	if (m_eGripper == xtpTaskPanelGripperBitmap)
	{

		return DrawCaptionGripperBitmap(pDC, pGroup, pGroup->IsExpanded(), pGroup->IsItemHot() , rc);
	}


	if (m_eGripper == xtpTaskPanelGripperPlain)
	{

		XTP_TASKPANEL_GROUPCOLORS* pGroupColors = GetGroupColors(pGroup);

		CRect rcGripper(rc.right - 6 - 17, rc.CenterPoint().y - 8, rc.right - 6, rc.CenterPoint().y + 8);

		if (pGroup->IsItemHot())
		{
			pDC->Draw3dRect(rcGripper, GetXtremeColor(COLOR_3DHIGHLIGHT), GetXtremeColor(COLOR_3DSHADOW));
		}

		DrawCaptionGripperSigns(pDC, rcGripper.CenterPoint(), pGroup->IsItemHot() ? pGroupColors->clrHeadTextHot : pGroupColors->clrHeadTextNormal, pGroup->IsExpanded());

		rc.right = rcGripper.left;
	}

	if (m_eGripper == xtpTaskPanelGripperTriangle)
	{

		COLORREF clr = m_groupNormal.clrClientText;
		CPoint pt(rc.right - 6 - 8 - 5, rc.CenterPoint().y + 2);

		if (pGroup->IsExpanded())
			CXTPDrawHelpers::Triangle(pDC, CPoint(pt.x, pt.y - 2), CPoint(pt.x + 10, pt.y - 2), CPoint(pt.x + 5, pt.y + 5 - 2), clr);
		else
			CXTPDrawHelpers::Triangle(pDC, CPoint(pt.x + 3, pt.y - 5), CPoint(pt.x + 3 + 5, pt.y), CPoint(pt.x + 3, pt.y + 5), clr);
		rc.right = pt.x;
	}
	return rc;
}


COLORREF CXTPTaskPanelPaintManager::BlendColor(COLORREF clrFrom, COLORREF clrTo, int nAlpha)
{
	return RGB(
		NORMCOLOR((GetRValue(clrFrom) * nAlpha + GetRValue(clrTo) * (255 - nAlpha)) / 255),
		NORMCOLOR((GetGValue(clrFrom) * nAlpha + GetGValue(clrTo) * (255 - nAlpha)) / 255),
		NORMCOLOR((GetBValue(clrFrom) * nAlpha + GetBValue(clrTo) * (255 - nAlpha)) / 255));
}

void CXTPTaskPanelPaintManager::SetItemsFontIndirect(LOGFONT* pLogFont, BOOL bUseStandardItemsFont /*= FALSE*/)
{
	m_bUseStandardItemsFont = bUseStandardItemsFont;
	if (!pLogFont)
		return;

	m_fntIcon.DeleteObject();
	m_fntIconBold.DeleteObject();
	m_fntIconHot.DeleteObject();
	m_fntIconHotBold.DeleteObject();


	pLogFont->lfWeight = FW_NORMAL;
	m_fntIcon.CreateFontIndirect(pLogFont);

	pLogFont->lfUnderline = TRUE;
	m_fntIconHot.CreateFontIndirect(pLogFont);

	pLogFont->lfUnderline = FALSE;
	pLogFont->lfWeight = FW_BOLD;
	m_fntIconBold.CreateFontIndirect(pLogFont);

	pLogFont->lfUnderline = TRUE;
	m_fntIconHotBold.CreateFontIndirect(pLogFont);
}

void CXTPTaskPanelPaintManager::SetCaptionFontIndirect(LOGFONT* pLogFont, BOOL bUseStandardCaptionFont /*= FALSE*/)
{
	m_bUseStandardCaptionFont = bUseStandardCaptionFont;
	if (!pLogFont)
		return;

	m_fntCaption.DeleteObject();
	m_fntCaption.CreateFontIndirect(pLogFont);

	CWindowDC dc(CWnd::GetDesktopWindow());
	CXTPFontDC fnt(&dc, &m_fntCaption);
	m_nCaptionHeight = max(25, dc.GetTextExtent(_T(" "), 1).cy);
}

void CXTPTaskPanelPaintManager::RefreshMetrics()
{
	RefreshXtremeColors();


	LOGFONT lfIcon;
	VERIFY(CXTPDrawHelpers::GetIconLogFont(&lfIcon));

	if (m_bUseStandardItemsFont)
	{
		SetItemsFontIndirect(&lfIcon, TRUE);
	}

	if (m_bUseStandardCaptionFont)
	{
		lfIcon.lfWeight = m_bBoldCaption ? FW_BOLD : FW_NORMAL;
		lfIcon.lfUnderline = FALSE;
		SetCaptionFontIndirect(&lfIcon, TRUE);
	}

	m_bOfficeBorder = FALSE;

	m_groupSpecial.dHeadGradientFactor = m_groupNormal.dHeadGradientFactor = 0;
	m_groupSpecial.clrClientBorder.SetStandardValue(RGB(255, 255, 255));
	m_groupNormal.clrClientBorder.SetStandardValue(RGB(255, 255, 255));


	m_clrBackground.SetStandardValue(GetXtremeColor(COLOR_WINDOW), GetXtremeColor(COLOR_WINDOW));

	m_groupSpecial.clrHead.SetStandardValue(GetXtremeColor(COLOR_ACTIVECAPTION), GetXtremeColor(COLOR_ACTIVECAPTION));
	m_groupSpecial.clrClientBorder.SetStandardValue(GetXtremeColor(COLOR_ACTIVECAPTION));
	m_groupSpecial.clrHeadTextHot.SetStandardValue(GetXtremeColor(COLOR_CAPTIONTEXT));
	m_groupSpecial.clrHeadTextNormal.SetStandardValue(GetXtremeColor(COLOR_CAPTIONTEXT));
	m_groupSpecial.clrClient.SetStandardValue(GetXtremeColor(COLOR_WINDOW));

	m_groupNormal.clrHead.SetStandardValue(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_3DFACE));
	m_groupNormal.clrClientBorder.SetStandardValue(GetXtremeColor(COLOR_3DFACE));
	m_groupNormal.clrHeadTextHot.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
	m_groupNormal.clrHeadTextNormal.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
	m_groupNormal.clrClient.SetStandardValue(GetXtremeColor(COLOR_WINDOW));

	m_groupSpecial.clrClientText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
	m_groupNormal.clrClientText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
	m_groupSpecial.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
	m_groupNormal.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
	m_groupSpecial.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_HIGHLIGHT));
	m_groupNormal.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_HIGHLIGHT));
	m_groupSpecial.clrClientLinkSelected.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
	m_groupNormal.clrClientLinkSelected.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));

	m_bLeftRoundedCorner = m_bRightRoundedCorner = FALSE;

	if (m_bOfficeHighlight)
	{
		m_clrHighlightHot.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT));
		m_clrHighlightSelected.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT_CHECKED));
		m_clrHighlightPressed.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT_PUSHED));
		m_clrHighlightBorder.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER));

		if (m_bOfficeHighlight == HIGHLIGHT_OFFICE2003)
		{
			XTPCurrentSystemTheme systemTheme = XTPColorManager()->GetCurrentSystemTheme();

			if (systemTheme != xtpSystemThemeUnknown)
			{
				m_clrHighlightHot.SetStandardValue(RGB(255, 238, 194));
				m_clrHighlightPressed.SetStandardValue(RGB(254, 128, 62));
				m_clrHighlightSelected.SetStandardValue(RGB(255, 192, 111));
			}
			switch (systemTheme)
			{
				case xtpSystemThemeBlue:
				case xtpSystemThemeRoyale:
				case xtpSystemThemeAero:
					m_clrHighlightBorder.SetStandardValue(RGB(0, 0, 128)); break;
				case xtpSystemThemeOlive:
					m_clrHighlightBorder.SetStandardValue(RGB(63, 93, 56)); break;
				case xtpSystemThemeSilver:
					m_clrHighlightBorder.SetStandardValue(RGB(75, 75, 111)); break;
			}
		}
	}
	else
	{
		m_clrHighlightHot.SetStandardValue(GetXtremeColor(COLOR_3DFACE));
		m_clrHighlightBorder.SetStandardValue(RGB(128, 128, 128), RGB(198, 198, 198));
	}
}

void CXTPTaskPanelPaintManager::FillTaskPanel(CDC* pDC, CXTPTaskPanel *pTaskPanel)
{
	CXTPClientRect rc(pTaskPanel);

	CRect rcFill(rc.left, 0, rc.right, max(rc.bottom, pTaskPanel->GetClientHeight()));

	XTPDrawHelpers()->GradientFill(pDC, rcFill, m_clrBackground, FALSE);
}

CRect CXTPTaskPanelPaintManager::MergeRect(CRect rc, CRect rcDefault)
{
	if (rc.left == CW_USEDEFAULT) rc.left = rcDefault.left;
	if (rc.top == CW_USEDEFAULT) rc.top = rcDefault.top;
	if (rc.right == CW_USEDEFAULT) rc.right = rcDefault.right;
	if (rc.bottom == CW_USEDEFAULT) rc.bottom = rcDefault.bottom;

	return rc;
}

CRect CXTPTaskPanelPaintManager::GetItemIconPadding(const CXTPTaskPanelItem* pItem)
{
	return MergeRect(const_cast<CXTPTaskPanelItem*>(pItem)->GetIconPadding(),
		pItem->IsGroup() ? m_rcGroupIconPadding : m_rcItemIconPadding);
}

CRect CXTPTaskPanelPaintManager::GetItemOuterMargins(const CXTPTaskPanelGroupItem* pItem)
{
	return MergeRect(const_cast<CXTPTaskPanelGroupItem*>(pItem)->GetMargins(), m_rcItemOuterMargins);
}

CRect CXTPTaskPanelPaintManager::GetItemInnerMargins(const CXTPTaskPanelGroupItem* /*pItem*/)
{
	return m_rcItemInnerMargins;
}

CRect CXTPTaskPanelPaintManager::GetGroupOuterMargins(const CXTPTaskPanelGroup* pGroup)
{
	return MergeRect(const_cast<CXTPTaskPanelGroup*>(pGroup)->GetOuterMargins(), m_rcGroupOuterMargins);
}

CRect CXTPTaskPanelPaintManager::GetGroupInnerMargins(const CXTPTaskPanelGroup* pGroup)
{
	return MergeRect(const_cast<CXTPTaskPanelGroup*>(pGroup)->GetInnerMargins(), m_rcGroupInnerMargins);
}

CRect CXTPTaskPanelPaintManager::GetControlMargins(const CXTPTaskPanel* pPanel)
{
	return MergeRect(const_cast<CXTPTaskPanel*>(pPanel)->GetMargins(), m_rcControlMargins);
}

int CXTPTaskPanelPaintManager::GetGroupSpacing(const CXTPTaskPanel* pPanel)
{
	return pPanel->m_nGroupSpacing == CW_USEDEFAULT ? m_nGroupSpacing : pPanel->m_nGroupSpacing;
}

void CXTPTaskPanelPaintManager::Rectangle(CDC* pDC, CRect rc, COLORREF clrPen, COLORREF clrBrush)
{
	pDC->FillSolidRect(rc, clrBrush);
	pDC->Draw3dRect(rc, clrPen, clrPen);
}

void CXTPTaskPanelPaintManager::DrawGroupItemFrame(CDC* pDC, CXTPTaskPanelGroupItem* pItem, CRect rc)
{
	if (m_bOfficeHighlight)
	{
		if (pItem->IsItemSelected() && !pItem->IsItemHot() && !pItem->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightSelected);
		else if (pItem->IsItemSelected() && pItem->IsItemHot() && !pItem->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightPressed);
		else if (pItem->IsItemHot() && pItem->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightPressed);
		else if (pItem->IsItemHot() || pItem->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightHot);

	}
	else
	{
		if (pItem->IsItemSelected() && (!pItem->IsItemHot() || pItem->IsItemPressed()))
			pDC->FillSolidRect(rc, m_clrHighlightHot);

		if (pItem->IsItemSelected() || (pItem->IsItemPressed() && pItem->IsItemHot()))
			pDC->Draw3dRect(rc, m_clrHighlightBorder.clrLight, m_clrHighlightBorder.clrDark);
		else if (pItem->IsItemHot() || pItem->IsItemPressed())
			pDC->Draw3dRect(rc, m_clrHighlightBorder.clrDark, m_clrHighlightBorder.clrLight);
	}
}

void CXTPTaskPanelPaintManager::DrawDragArrow(CDC* pDC, CXTPTaskPanelItem* pItem, CRect rc, BOOL bAfter)
{
	if (m_bInvertDragRect)
	{
		pDC->InvertRect(rc);
	}
	else
	{
		if (!pItem->IsGroup() && pItem->GetItemGroup()->GetItemLayout() != xtpTaskItemLayoutImages)
		{
			CRect rcMargin = GetControlMargins(pItem->GetTaskPanel());
			rcMargin.InflateRect(GetGroupOuterMargins(pItem->GetItemGroup()));

			CXTPClientRect rcControl(pItem->GetTaskPanel());
			rc.left = rcControl.left + rcMargin.left + 2;
			rc.right = rcControl.right - rcMargin.right - 2;
		}

		int y = bAfter ? rc.bottom - 1 : rc.top - 1;

		COLORREF clr = RGB(0 /*xFF*/, 0, 0);

		pDC->FillSolidRect(rc.left, y, rc.Width(), 1, clr);
		pDC->FillSolidRect(rc.left + 0, y - 3 , 1, 7, clr);
		pDC->FillSolidRect(rc.left + 1, y - 2 , 1, 5, clr);
		pDC->FillSolidRect(rc.left + 2, y - 1 , 1, 3, clr);
		pDC->FillSolidRect(rc.right - 1, y - 3 , 1, 7, clr);
		pDC->FillSolidRect(rc.right - 2, y - 2 , 1, 5, clr);
		pDC->FillSolidRect(rc.right - 3, y - 1 , 1, 3, clr);

	}
}

CRect CXTPTaskPanelPaintManager::DrawGroupItem(CDC* pDC, CXTPTaskPanelGroupItem* pItem, CRect rc, BOOL bDraw)
{
	XTPTaskPanelItemLayout itemLayout = pItem->GetItemGroup()->GetItemLayout();

	CRect rcItem = itemLayout == xtpTaskItemLayoutImagesWithTextBelow ? DrawGroupItemImageWithTextBelow(pDC, pItem, rc, bDraw) :
		itemLayout == xtpTaskItemLayoutImages ? DrawGroupItemImage(pDC, pItem, rc, bDraw) :  DrawGroupItemImageWithText(pDC, pItem, rc, bDraw);

	if (bDraw && pItem->IsItemDragOver() && !pItem->IsItemDragging())
	{
		DrawDragArrow(pDC, pItem, rc);
	}
	if (bDraw && pItem->GetItemGroup()->IsItemDragOver() &&
		pItem->GetParentItems()->GetLastVisibleItem() == pItem)
	{
		DrawDragArrow(pDC, pItem, rc, TRUE);
	}

	return rcItem;
}

void CXTPTaskPanelPaintManager::DrawFocusRect(CDC* pDC, CRect rc)
{
	pDC->SetTextColor(0);
	pDC->SetBkColor(0xFFFFFF);

	pDC->DrawFocusRect(rc);
}

CRect CXTPTaskPanelPaintManager::DrawGroupItemImageWithText(CDC* pDC, CXTPTaskPanelGroupItem* pItem, CRect rc, BOOL bDraw)
{
	CXTPTaskPanelGroup* pGroup = pItem->GetItemGroup();
	ASSERT(pGroup);
	if (!pGroup)
		return 0;

	XTPTaskPanelHotTrackStyle hotTrackStyle = pItem->GetTaskPanel()->GetHotTrackStyle();
	CSize szIcon = pGroup->GetItemIconSize();

	CXTPFontDC font(pDC, GetItemFont(pItem));

	CXTPImageManagerIcon* pImage = pItem->GetImage(szIcon.cx);
	BOOL bDrawIcon = pItem->GetType() != xtpTaskItemTypeControl && pImage;
	CRect rcInnerMargins = GetItemInnerMargins(pItem);

	if (bDraw)
	{
		if (hotTrackStyle == xtpTaskPanelHighlightItem)
		{
			DrawGroupItemFrame(pDC, pItem, rc);
		}
		rc.DeflateRect(rcInnerMargins.left, rcInnerMargins.top, rcInnerMargins.right, rcInnerMargins.bottom);

		CRect rcText(rc);

		if (hotTrackStyle == xtpTaskPanelHighlightItem)
			rcText.OffsetRect(GetHighlightOffset(pItem));

		CRect rcIconPadding(GetItemIconPadding(pItem));

		if (bDrawIcon)
		{
			if (hotTrackStyle == xtpTaskPanelHighlightImage)
			{
				CRect rcImage(rc.left - rcInnerMargins.left, rc.top - rcInnerMargins.top,
					rc.left + szIcon.cx + 2 + rcIconPadding.left + rcIconPadding.right,
					rc.top + szIcon.cy + 2 + rcIconPadding.top + rcIconPadding.bottom);
				DrawGroupItemFrame(pDC, pItem, rcImage);
			}
			CPoint ptIcon(rc.TopLeft());

			if (hotTrackStyle == xtpTaskPanelHighlightImage || hotTrackStyle == xtpTaskPanelHighlightItem)
				ptIcon.Offset(GetHighlightOffset(pItem));

			ptIcon.Offset(rcIconPadding.left, rcIconPadding.top);

			DrawItemImage(pDC, pItem, ptIcon, pImage, szIcon);
		}

		if (bDrawIcon || pItem->GetType() == xtpTaskItemTypeLink)
		{
			rcText.left += szIcon.cx + 7 + rcIconPadding.left + rcIconPadding.right;
		}

		if (rcText.Width() > 0)
		{
			DrawItemCaption(pDC, pItem, rcText, m_nItemTextFormat | DT_LEFT);
		}

		if (pItem->IsItemFocused() && pItem->GetTaskPanel()->IsDrawFocusRect())
		{
			DrawFocusRect(pDC, rc);
		}
		return 0;
	}
	else
	{
		CRect rcText(rc);
		rcText.bottom = rcText.top;
		rcText.DeflateRect(rcInnerMargins.left, 0, rcInnerMargins.right, 0);

		CRect rcIconPadding(GetItemIconPadding(pItem));

		if (pItem->GetType() == xtpTaskItemTypeLink || bDrawIcon)
		{
			rcText.left += szIcon.cx + 7 + rcIconPadding.left + rcIconPadding.right;
		}

		if (rcText.Width() > 0)
		{
			CSize szText = pItem->GetCaptionTextSize(pDC, rcText, (m_nItemTextFormat | DT_LEFT) & ~(DT_VCENTER | DT_CENTER));
			rcText.bottom = rcText.top + szText.cy;
			rcText.right = rcText.left + szText.cx;
		}
		int nImageHeight = bDrawIcon ? szIcon.cy + rcIconPadding.top + rcIconPadding.bottom : 0;

		return CRect(rc.left, rc.top, hotTrackStyle == xtpTaskPanelHighlightItem ? rc.right : min(rc.right, (rcText.right + rcInnerMargins.right)),
			rc.top + max(nImageHeight, rcText.Height()) + rcInnerMargins.top + rcInnerMargins.bottom);

	}
}


CRect CXTPTaskPanelPaintManager::DrawGroupItemImageWithTextBelow(CDC* pDC, CXTPTaskPanelGroupItem* pItem, CRect rc, BOOL bDraw)
{
	CXTPTaskPanelGroup* pGroup = pItem->GetItemGroup();
	ASSERT(pGroup);
	if (!pGroup)
		return 0;

	XTPTaskPanelHotTrackStyle hotTrackStyle = pItem->GetTaskPanel()->GetHotTrackStyle();
	CSize szIcon = pGroup->GetItemIconSize();

	CXTPFontDC font(pDC, GetItemFont(pItem));

	CXTPImageManagerIcon* pImage = pItem->GetImage(szIcon.cx);
	BOOL bDrawIcon = pItem->GetType() == xtpTaskItemTypeLink && pImage;
	CRect rcInnerMargins = GetItemInnerMargins(pItem);

	if (bDraw)
	{
		if (hotTrackStyle == xtpTaskPanelHighlightItem)
		{
			DrawGroupItemFrame(pDC, pItem, rc);
		}
		rc.DeflateRect(rcInnerMargins.left, rcInnerMargins.top, rcInnerMargins.right, rcInnerMargins.bottom);

		CRect rcText(rc);
		if (hotTrackStyle == xtpTaskPanelHighlightItem)
			rcText.OffsetRect(GetHighlightOffset(pItem));

		if (pItem->GetType() == xtpTaskItemTypeLink)
		{
			if (bDrawIcon)
			{
				CPoint ptIcon((rc.right + rc.left + 1 - szIcon.cx) /2, rc.top);

				if (hotTrackStyle == xtpTaskPanelHighlightImage)
				{
					CRect rcImage(ptIcon.x - 2, rc.top - 2, ptIcon.x + szIcon.cx + 2, rc.top + szIcon.cy + 2);
					DrawGroupItemFrame(pDC, pItem, rcImage);
				}

				if (hotTrackStyle == xtpTaskPanelHighlightImage || hotTrackStyle == xtpTaskPanelHighlightItem)
					ptIcon.Offset(GetHighlightOffset(pItem));

				DrawItemImage(pDC, pItem, ptIcon, pImage, szIcon);
			}

			rcText.top += szIcon.cy + 3;
		}

		if (rcText.Width() > 0)
		{
			DrawItemCaption(pDC, pItem, rcText, m_nItemTextFormat | DT_CENTER);
		}

		if (pItem->IsItemFocused() && pItem->GetTaskPanel()->IsDrawFocusRect())
		{
			DrawFocusRect(pDC, rc);
		}
		return 0;
	}
	else
	{
		CRect rcText(rc);
		rcText.bottom = rcText.top;
		rcText.DeflateRect(rcInnerMargins.left, 0, rcInnerMargins.right, 0);

		if (rcText.Width() > 0)
		{
			CSize szText = pItem->GetCaptionTextSize(pDC, rcText, m_nItemTextFormat | DT_LEFT);
			rcText.bottom = rcText.top + szText.cy;
			rcText.right = rcText.left + szText.cx;
		}
		int nHeight = rcText.Height() + (bDrawIcon ? (szIcon.cy + 3) : 0);
		int nWidth = max(bDrawIcon ? (szIcon.cx + 4) : 0, rcText.Width()) + rcInnerMargins.right + + rcInnerMargins.left;
		nWidth = min(nWidth, rc.Width());

		if (hotTrackStyle != xtpTaskPanelHighlightItem)
			return CRect(rc.CenterPoint().x - nWidth + nWidth /2, rc.top, rc.CenterPoint().x + nWidth /2, rc.top + nHeight + rcInnerMargins.top + rcInnerMargins.bottom);

		return CRect(rc.left, rc.top, rc.right, rc.top + nHeight + rcInnerMargins.top + rcInnerMargins.bottom);

	}
}


CRect CXTPTaskPanelPaintManager::DrawGroupItemImage(CDC* pDC, CXTPTaskPanelGroupItem* pItem, CRect rc, BOOL bDraw)
{
	CXTPTaskPanelGroup* pGroup = pItem->GetItemGroup();
	ASSERT(pGroup);
	if (!pGroup)
		return 0;

	XTPTaskPanelHotTrackStyle hotTrackStyle = pItem->GetTaskPanel()->GetHotTrackStyle();
	CSize szIcon = pGroup->GetItemIconSize();

	CXTPImageManagerIcon* pImage = pItem->GetImage(szIcon.cx);
	CRect rcInnerMargins = GetItemInnerMargins(pItem);
	BOOL bDrawIcon = pImage != NULL;

	if (bDraw)
	{
		CPoint ptIcon(rc.left + m_rcImageLayoutIconPadding.left, rc.top + m_rcImageLayoutIconPadding.top);

		if (hotTrackStyle != xtpTaskPanelHighlightNone)
		{
			DrawGroupItemFrame(pDC, pItem, rc);
			ptIcon.Offset(GetHighlightOffset(pItem));
		}
		rc.DeflateRect(rcInnerMargins.left, rcInnerMargins.top, rcInnerMargins.right, rcInnerMargins.bottom);

		if (bDrawIcon)
		{
			DrawItemImage(pDC, pItem, ptIcon, pImage, szIcon);
		}

		if (pItem->IsItemFocused() && pItem->GetTaskPanel()->IsDrawFocusRect())
		{
			DrawFocusRect(pDC, rc);
		}
		return 0;
	}
	else
	{
		int nHeight = szIcon.cy + rcInnerMargins.top + rcInnerMargins.bottom;
		int nWidth = szIcon.cx + rcInnerMargins.right + rcInnerMargins.left;

		return CRect(rc.CenterPoint().x - nWidth /2, rc.top, rc.CenterPoint().x - nWidth /2 + nWidth, rc.top + nHeight);
	}
}



void CXTPTaskPanelPaintManager::DrawGroupClientItems(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	int nOffset = rc.top - pGroup->GetScrollOffsetPos();

	for (int i = pGroup->GetOffsetItem(); i < pGroup->GetItemCount(); i++)
	{
		CXTPTaskPanelGroupItem* pItem = pGroup->GetAt(i);
		if (!pItem->IsVisible())
			continue;

		CRect rcItem = pItem->GetItemRect();
		rcItem.OffsetRect(0, nOffset);

		pItem->OnDrawItem(pDC, rcItem);
	}
}

void CXTPTaskPanelPaintManager::FillGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	XTPDrawHelpers()->GradientFill(pDC, rc, GetGroupColors(pGroup)->clrClient, FALSE);
}

void CXTPTaskPanelPaintManager::DrawGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	XTP_TASKPANEL_GROUPCOLORS* pGroupColors = GetGroupColors(pGroup);

	CXTPPenDC pen(*pDC, pGroupColors->clrClientBorder);
	pDC->MoveTo(rc.TopLeft());
	pDC->LineTo(rc.left, rc.bottom - 1);
	if (m_bOfficeBorder) pDC->LineTo(rc.right, rc.bottom - 1); else pDC->LineTo(rc.right - 1, rc.bottom - 1);
	if (!m_bOfficeBorder) pDC->LineTo(rc.right - 1, rc.top - 1); else pDC->MoveTo(rc.right - 1, rc.top);
	if (m_bOfficeBorder) pDC->LineTo(rc.TopLeft());

	DrawGroupClientItems(pDC, pGroup, rc);
}

void CXTPTaskPanelPaintManager::DrawGroupClient(CDC* pDC, CXTPTaskPanelGroup* pGroup)
{
	CRect rc = pGroup->GetClientRect();
	if (rc.IsRectEmpty())
		return;

	int nExpandedClientHeight = pGroup->GetExpandedClientHeight();

	int nOffset = pGroup->IsExpanding() ? nExpandedClientHeight - rc.Height() : 0;

	CRect rcExpaded(rc);
	if (nOffset)
		rcExpaded.bottom = rcExpaded.top + nExpandedClientHeight;

	CDC dc;
	dc.CreateCompatibleDC(pDC);
	CBitmap bmp;
	bmp.CreateCompatibleBitmap(pDC, rc.right + 1, rcExpaded.Height());

	CGdiObject* pOldBitmap = dc.SelectObject(&bmp);

	dc.SetWindowOrg(0, rc.top);

	int nAlpha = pGroup->IsExpanding() ? (255 * rc.Height()) / max(1, nExpandedClientHeight) : 255;

	if (GetGroupColors(pGroup)->clrClient == COLORREF_TRANSPARENT)
	{
		dc.BitBlt(rc.left, rc.top + nOffset, rc.Width(), rc.Height(), pDC, rc.left, rc.top, SRCCOPY);
	}
	else
	{
		FillGroupClientFace(&dc, pGroup, rcExpaded);
	}
	pGroup->OnFillClient(&dc, rcExpaded);


	if (pGroup->IsExpanded() || pGroup->IsExpanding())
	{
		DrawGroupClientFace(&dc, pGroup, rcExpaded);
	}

	dc.SetWindowOrg(0, 0);

	if (nAlpha != 255)
	{
		if (!XTPDrawHelpers()->m_pfnAlphaBlend || (XTPDrawHelpers()->IsContextRTL(pDC) && XTPSystemVersion()->IsWin9x()))
		{
			pDC->BitBlt(rc.left, rc.top, rc.Width(), rcExpaded.Height() - nOffset, &dc, rc.left, nOffset, SRCCOPY);
		}
		else
		{
			BLENDFUNCTION bf = {AC_SRC_OVER, 0, (BYTE)nAlpha, 0};
			XTPDrawHelpers()->m_pfnAlphaBlend(pDC->GetSafeHdc(), rc.left, rc.top, rc.Width(), rc.Height(), dc, rc.left, nOffset, rc.Width(), rcExpaded.Height() - nOffset, bf);
		}
	}
	else
	{
		pDC->BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), &dc, rc.left, nOffset, SRCCOPY);
	}

	dc.SelectObject(pOldBitmap);

}

void CXTPTaskPanelPaintManager::DrawItemCaption(CDC* pDC, CXTPTaskPanelItem* pItem, CRect rcText, UINT nFormat)
{
	if (!pItem->IsGroup())
	{
		XTPTaskPanelHotTrackStyle hotTrackStyle = pItem->GetTaskPanel()->GetHotTrackStyle();

		CXTPTaskPanelGroup* pGroup = pItem->GetItemGroup();
		XTP_TASKPANEL_GROUPCOLORS* pGroupColors = GetGroupColors(pGroup);

		pDC->SetBkMode(TRANSPARENT);

		if (m_bEmbossedDisabledText && !pItem->GetEnabled())
		{
			pDC->SetTextColor(GetXtremeColor(COLOR_3DHIGHLIGHT));
			pItem->DrawCaptionText(pDC, rcText + CPoint(1, 1), nFormat);
		}
		COLORREF clrNormal = ((CXTPTaskPanelGroupItem*)pItem)->GetTextColor();
		if (clrNormal == COLORREF_NULL)
			clrNormal = pItem->GetType() == xtpTaskItemTypeLink ? pGroupColors->clrClientLink : pGroupColors->clrClientText;

		pDC->SetTextColor(!pItem->GetEnabled() ? GetXtremeColor(COLOR_GRAYTEXT) : pItem->GetType() == xtpTaskItemTypeLink ?
			(pItem->IsItemHot() && (hotTrackStyle == xtpTaskPanelHighlightText || pGroupColors->clrClientLinkHot.IsCustomValue()) ? pGroupColors->clrClientLinkHot :
			(hotTrackStyle == xtpTaskPanelHighlightItem) && (((CXTPTaskPanelGroupItem*)pItem)->IsItemSelected() || (pItem->IsItemHot())) ? pGroupColors->clrClientLinkSelected :
			clrNormal) : clrNormal);
	}

	pItem->DrawCaptionText(pDC, rcText, nFormat);
	pItem->SetTextRect(pDC, rcText, nFormat);
}

void CXTPTaskPanelPaintManager::DrawItemImage(CDC* pDC, CXTPTaskPanelItem* pItem, CPoint ptIcon, CXTPImageManagerIcon* pImage, CSize szIcon)
{
	BOOL bHighlight = pItem->IsItemHot() || pItem->IsItemPressed();
	BOOL bChecked = (!pItem->IsGroup() && ((CXTPTaskPanelGroupItem*)pItem)->IsItemSelected());

	pImage->Draw(pDC, ptIcon, !pItem->GetEnabled() ? pImage->GetDisabledIcon(): bHighlight ? pImage->GetHotIcon(): bChecked ? pImage->GetCheckedIcon() : pImage->GetIcon(), szIcon);
}

int CXTPTaskPanelPaintManager::DrawGroupCaption(CDC* pDC, CXTPTaskPanelGroup* pGroup, BOOL bDraw)
{
	if (bDraw)
	{
		CRect rc = pGroup->GetCaptionRect();

		if (rc.IsRectEmpty())
			return 0;

		XTP_TASKPANEL_GROUPCOLORS* pGroupColors = GetGroupColors(pGroup);

		if (pGroup->IsCaptionVisible())
		{
			HRGN hrgnClip = ::CreateRectRgn(0, 0, 0, 0);

			if (hrgnClip != NULL)
			{
				if (GetClipRgn(pDC->m_hDC, hrgnClip) != 1)
				{
					DeleteObject(hrgnClip);
					hrgnClip = (HRGN)-1;
				}
			}


			if (m_bLeftRoundedCorner)
			{
				pDC->ExcludeClipRect(rc.left, rc.top, rc.left + 2, rc.top + 1);
				pDC->ExcludeClipRect(rc.left, rc.top + 1, rc.left + 1, rc.top + 2);
			}

			if (m_bRightRoundedCorner)
			{
				pDC->ExcludeClipRect(rc.right, rc.top, rc.right - 2, rc.top + 1);
				pDC->ExcludeClipRect(rc.right, rc.top + 1, rc.right - 1, rc.top + 2);
			}

			pDC->FillSolidRect(rc, pGroupColors->clrHead.clrLight);
			CRect rcGradient(rc);
			rcGradient.left += int (rc.Width() * pGroupColors->dHeadGradientFactor);
			XTPDrawHelpers()->GradientFill(pDC, rcGradient, pGroupColors->clrHead, TRUE);

			if (pGroup->IsItemFocused() && pGroup->GetTaskPanel()->IsDrawFocusRect())
			{
				CRect rcFocus(rc);
				rcFocus.DeflateRect(2, 2);
				DrawFocusRect(pDC, rcFocus);
			}


			if (hrgnClip != NULL)
			{
				if (hrgnClip == (HRGN)-1)
				{
					ExtSelectClipRgn(pDC->m_hDC, NULL, RGN_COPY);
				}
				else
				{
					ExtSelectClipRgn(pDC->m_hDC, hrgnClip, RGN_COPY);
					DeleteObject(hrgnClip);
				}
			}


			CXTPFontDC fnt(pDC, GetItemFont(pGroup));

			CRect rcText = DrawCaptionGripper(pDC, pGroup, rc);

			CSize szIcon = pGroup->GetTaskPanel()->GetGroupIconSize();
			CXTPImageManagerIcon* pImage = pGroup->GetImage(szIcon.cx);

			if (rcText.Width() > szIcon.cx && pImage)
			{
				szIcon.cy = pImage->GetHeight() * szIcon.cx / pImage->GetWidth();

				CRect rcIconPadding(GetItemIconPadding(pGroup));
				CPoint ptIcon(rcText.left + rcIconPadding.left,
					min(rcText.CenterPoint().y + szIcon.cy/2, rcText.bottom) - szIcon.cy - rcIconPadding.bottom + rcIconPadding.top);

				DrawItemImage(pDC, pGroup, ptIcon, pImage, szIcon);

				rcText.left += szIcon.cx - 12 + rcIconPadding.right + rcIconPadding.left;
			}

			rcText.left += 13;
			rcText.bottom += 2;

			pDC->SetBkMode(TRANSPARENT);
			pDC->SetTextColor(!pGroup->GetEnabled() ? GetXtremeColor(COLOR_GRAYTEXT) :
				pGroup->IsItemHot() ? pGroupColors->clrHeadTextHot : pGroupColors->clrHeadTextNormal);

			DrawItemCaption(pDC, pGroup, rcText, m_nCaptionTextFormat);

		}
		else
		{
			pDC->FillSolidRect(rc, pGroupColors->clrClientBorder);
		}
		if (pGroup->IsItemDragOver() && !(pGroup->IsExpanded() && pGroup->GetItems()->GetFirstVisibleItem() != NULL))
		{
			DrawDragArrow(pDC, pGroup, rc, TRUE);
		}
	}

	return pGroup->IsCaptionVisible() ? m_nCaptionHeight: m_bOfficeBorder ? 0 : 1;
}







//////////////////////////////////////////////////////////////////////////
/// CXTPTaskPanelExplorerTheme

CXTPTaskPanelExplorerTheme::CXTPTaskPanelExplorerTheme()
{
	m_bOfficeHighlight = HIGHLIGHT_OFFICE2003;
	m_eGripper = xtpTaskPanelGripperBitmap;
	m_bExplorerTheme = FALSE;
}

void CXTPTaskPanelExplorerTheme::RefreshMetrics()
{
	CXTPTaskPanelPaintManager::RefreshMetrics();

	XTPCurrentSystemTheme systemTheme = XTPColorManager()->GetCurrentSystemTheme();

	m_bExplorerTheme = FALSE;

	if (!m_bEmulateEplorerTheme && (systemTheme == xtpSystemThemeUnknown))
	{
		m_eGripper = xtpTaskPanelGripperPlain;
		return ;
	}
	m_bExplorerTheme = TRUE;

	m_bRightRoundedCorner = m_bLeftRoundedCorner = TRUE;
	m_groupNormal.clrClientBorder.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
	m_groupSpecial.clrClientBorder.SetStandardValue(GetXtremeColor(COLOR_WINDOW));

	switch (systemTheme)
	{
		case xtpSystemThemeBlue:
		{
			m_clrBackground.SetStandardValue(RGB(123, 162, 231), RGB(99, 117, 214));

			m_groupSpecial.clrHead.SetStandardValue(RGB(0, 73, 181), RGB(41, 93, 206));
			m_groupSpecial.clrHeadTextNormal.SetStandardValue(RGB(255, 255, 255));
			m_groupSpecial.clrHeadTextHot.SetStandardValue(RGB(66, 142, 255));
			m_groupSpecial.clrClient.SetStandardValue(RGB(239, 243, 255));

			m_groupNormal.clrHead.SetStandardValue(RGB(255, 255, 255), RGB(198, 211, 247));
			m_groupNormal.dHeadGradientFactor = 0.5;
			m_groupNormal.clrHeadTextNormal.SetStandardValue(RGB(33, 93, 198));
			m_groupNormal.clrHeadTextHot.SetStandardValue(RGB(66, 142, 255));
			m_groupNormal.clrClient.SetStandardValue(RGB(214, 223, 247));

			m_groupSpecial.clrClientLink.SetStandardValue(RGB(33, 93, 198));
			m_groupNormal.clrClientLink.SetStandardValue(RGB(33, 93, 198));
			m_groupSpecial.clrClientLinkHot.SetStandardValue(RGB(66, 142, 255));
			m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(66, 142, 255));

			break;

		}
		case xtpSystemThemeOlive:
		{
			m_clrBackground.SetStandardValue(RGB(204, 217, 173), RGB(165, 189, 132));

			m_groupSpecial.clrHead.SetStandardValue(RGB(119, 140, 64), RGB(150, 168, 103));
			m_groupSpecial.clrHeadTextNormal.SetStandardValue(RGB(255, 255, 255));
			m_groupSpecial.clrHeadTextHot.SetStandardValue(RGB(224, 231, 184));
			m_groupSpecial.clrClient.SetStandardValue(RGB(246, 246, 236));

			m_groupNormal.clrHead.SetStandardValue(RGB(255, 252, 236), RGB(224, 231, 184));
			m_groupNormal.clrHeadTextNormal.SetStandardValue(RGB(86, 102, 45));
			m_groupNormal.clrHeadTextHot.SetStandardValue(RGB(114, 146, 29));
			m_groupNormal.clrClient.SetStandardValue(RGB(246, 246, 236));

			m_groupSpecial.clrClientLink.SetStandardValue(RGB(86, 102, 45));
			m_groupNormal.clrClientLink.SetStandardValue(RGB(86, 102, 45));
			m_groupSpecial.clrClientLinkHot.SetStandardValue(RGB(114, 146, 29));
			m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(114, 146, 29));

			break;
		}
		case xtpSystemThemeSilver:
		{
			m_clrBackground.SetStandardValue(RGB(196, 200, 212), RGB(177, 179, 200));

			m_groupSpecial.clrHead.SetStandardValue(RGB(119, 119, 146), RGB(180, 182, 199));
			m_groupSpecial.clrHeadTextNormal.SetStandardValue(RGB(255, 255, 255));
			m_groupSpecial.clrHeadTextHot.SetStandardValue(RGB(230, 230, 230));
			m_groupSpecial.clrClient.SetStandardValue(RGB(240, 241, 245));

			m_groupNormal.clrHead.SetStandardValue(RGB(255, 255, 255), RGB(214, 215, 224));
			m_groupNormal.clrHeadTextNormal.SetStandardValue(RGB(63, 61, 61));
			m_groupNormal.clrHeadTextHot.SetStandardValue(RGB(126, 124, 124));
			m_groupNormal.clrClient.SetStandardValue(RGB(240, 241, 245));

			m_groupSpecial.clrClientLink.SetStandardValue(RGB(63, 61, 61));
			m_groupNormal.clrClientLink.SetStandardValue(RGB(63, 61, 61));
			m_groupSpecial.clrClientLinkHot.SetStandardValue(RGB(126, 124, 124));
			m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(126, 124, 124));

			break;
		}
		default:
		{
			m_clrBackground.SetStandardValue(
				BlendColor(GetXtremeColor(COLOR_INACTIVECAPTION), GetXtremeColor(COLOR_WINDOW), 128),
				BlendColor(GetXtremeColor(COLOR_ACTIVECAPTION), GetXtremeColor(COLOR_WINDOW), 192));

			COLORREF clrClient = BlendColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 24);

			m_groupSpecial.clrHead.SetStandardValue(GetXtremeColor(COLOR_ACTIVECAPTION), BlendColor(GetXtremeColor(COLOR_ACTIVECAPTION), GetXtremeColor(COLOR_WINDOW), 92));

			m_groupSpecial.clrHeadTextNormal.SetStandardValue(GetXtremeColor(COLOR_CAPTIONTEXT));
			m_groupSpecial.clrHeadTextHot.SetStandardValue(BlendColor(GetXtremeColor(COLOR_3DHIGHLIGHT), GetXtremeColor(COLOR_HIGHLIGHT), 128));
			m_groupSpecial.clrClient.SetStandardValue(clrClient);


			m_groupNormal.clrHead.SetStandardValue(GetXtremeColor(COLOR_WINDOW), BlendColor(GetXtremeColor(COLOR_INACTIVECAPTION), GetXtremeColor(COLOR_WINDOW), 92));

			m_groupNormal.clrHeadTextNormal.SetStandardValue(BlendColor(GetXtremeColor(COLOR_HIGHLIGHT), GetXtremeColor(COLOR_BTNTEXT), 192));
			m_groupNormal.clrHeadTextHot.SetStandardValue(BlendColor(GetXtremeColor(COLOR_HIGHLIGHT), GetXtremeColor(COLOR_BTNTEXT), 240));
			m_groupNormal.clrClient.SetStandardValue(BlendColor(clrClient, GetXtremeColor(COLOR_ACTIVECAPTION), 230));

			m_groupSpecial.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
			m_groupNormal.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
			m_groupSpecial.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_HIGHLIGHT));
			m_groupNormal.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_HIGHLIGHT));

		}
	}

	CreateGripperBitmaps();

}


//////////////////////////////////////////////////////////////////////////
/// CXTPTaskPanelOffice2003Theme

CXTPTaskPanelOffice2003Theme::CXTPTaskPanelOffice2003Theme()
{
	m_bOfficeHighlight = HIGHLIGHT_OFFICE2003;
	m_rcControlMargins = CRect(8, 8, 0, 8);
	m_nGroupSpacing = 15;
	m_eGripper = xtpTaskPanelGripperNone;
}

void CXTPTaskPanelOffice2003Theme::RefreshMetrics()
{
	CXTPTaskPanelPaintManager::RefreshMetrics();

	if (m_bUseStandardCaptionFont)
	{
		m_fntCaption.DeleteObject();

		LOGFONT lfIcon;
		VERIFY(CXTPDrawHelpers::GetIconLogFont(&lfIcon));

		lfIcon.lfUnderline = FALSE;
		lfIcon.lfWeight = FW_BOLD;
		lfIcon.lfHeight = 18;

		CString strOfficeFont(_T("Tahoma"));
		if (CXTPDrawHelpers::FontExists(strOfficeFont))
		{
			STRCPY_S(lfIcon.lfFaceName, LF_FACESIZE, strOfficeFont);
		}
		m_fntCaption.CreateFontIndirect(&lfIcon);

		CWindowDC dc(CWnd::GetDesktopWindow());
		CXTPFontDC fnt(&dc, &m_fntCaption);
		m_nCaptionHeight = max(20, dc.GetTextExtent(_T(" "), 1).cy);
	}


	XTPCurrentSystemTheme systemTheme = XTPColorManager()->GetCurrentSystemTheme();

	switch (systemTheme)
	{
		case xtpSystemThemeBlue:
		case xtpSystemThemeRoyale:
		case xtpSystemThemeAero:

			m_clrBackground.SetStandardValue(RGB(221, 236, 254), RGB(74, 122, 201));
			m_groupNormal.clrHead.SetStandardValue(RGB(196, 219, 249), RGB(101, 143, 224));
			m_groupNormal.clrHeadTextHot.SetStandardValue(RGB(0, 45, 134));
			m_groupNormal.clrHeadTextNormal.SetStandardValue(RGB(0, 45, 134));
			m_groupNormal.clrClient.SetStandardValue(RGB(221, 236, 254));
			m_groupNormal.clrClientLink.SetStandardValue(RGB(0, 61, 178));
			m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(0, 61, 178));
			break;

		case xtpSystemThemeOlive:

			m_clrBackground.SetStandardValue(RGB(243, 242, 231), RGB(190, 198, 152));
			m_groupNormal.clrHead.SetStandardValue(RGB(210, 223, 174), RGB(161, 176, 128));
			m_groupNormal.clrHeadTextHot.SetStandardValue(RGB(90, 107, 70));
			m_groupNormal.clrHeadTextNormal.SetStandardValue(RGB(90, 107, 70));
			m_groupNormal.clrClient.SetStandardValue(RGB(243, 242, 231));
			m_groupNormal.clrClientLink.SetStandardValue(RGB(0, 61, 178));
			m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(0, 61, 178));
			break;

		case xtpSystemThemeSilver:

			m_clrBackground.SetStandardValue(RGB(238, 238, 244), RGB(177, 176, 195));
			m_groupNormal.clrHead.SetStandardValue(RGB(207, 207, 222), RGB(169, 168, 191));
			m_groupNormal.clrHeadTextHot.SetStandardValue(RGB(92, 91, 121));
			m_groupNormal.clrHeadTextNormal.SetStandardValue(RGB(92, 91, 121));
			m_groupNormal.clrClient.SetStandardValue(RGB(238, 238, 244));
			m_groupNormal.clrClientLink.SetStandardValue(RGB(0, 61, 178));
			m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(0, 61, 178));
			break;

		default:
			m_clrBackground.SetStandardValue(XTPColorManager()->LightColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 50), GetXtremeColor(COLOR_3DFACE));

			m_groupNormal.clrHead.SetStandardValue(XTPColorManager()->LightColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 39),
				XTPColorManager()->LightColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 70));

			m_groupNormal.clrHeadTextHot.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
			m_groupNormal.clrHeadTextNormal.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
			m_groupNormal.clrClient.SetStandardValue(XTPColorManager()->LightColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 49));

			m_groupNormal.clrClientLink.SetStandardValue(RGB(0, 0, 0xFF));
			m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(0, 0, 0xFF));
	}
	m_groupNormal.clrClientBorder.SetStandardValue(GetXtremeColor(COLOR_WINDOW));



	m_groupSpecial = m_groupNormal;


	m_bLeftRoundedCorner = TRUE;
	m_bRightRoundedCorner = FALSE;
	m_bOfficeBorder = TRUE;

}

//////////////////////////////////////////////////////////////////////////
/// CXTPTaskPanelPaintManagerPlain

CXTPTaskPanelPaintManagerPlain::CXTPTaskPanelPaintManagerPlain()
{
	m_bRoundedFrame = TRUE;
	m_bOfficeCaption = FALSE;

	m_nCaptionTextFormat = DT_WORDBREAK | DT_LEFT | DT_NOPREFIX;
	m_rcGroupIconPadding.SetRect(0, 0, 3, 0);
	m_eGripper = xtpTaskPanelGripperTriangle;
}

void CXTPTaskPanelPaintManagerPlain::RefreshMetrics()
{
	CXTPTaskPanelPaintManager::RefreshMetrics();

	m_clrBackground.SetStandardValue(GetXtremeColor(COLOR_BACKGROUND), GetXtremeColor(COLOR_BACKGROUND));
	m_groupNormal.clrClient.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
	m_groupNormal.clrClientBorder.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
	m_groupNormal.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
	m_groupNormal.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_HIGHLIGHT));

	m_groupSpecial = m_groupNormal;
}

void CXTPTaskPanelPaintManagerPlain::FillGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	pDC->FillSolidRect(rc, GetGroupColors(pGroup)->clrClient);
}

void CXTPTaskPanelPaintManagerPlain::DrawGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	DrawGroupClientItems(pDC, pGroup, rc);
}

void CXTPTaskPanelPaintManagerPlain::FillTaskPanel(CDC* pDC, CXTPTaskPanel* pTaskPanel)
{
	CXTPClientRect rc(pTaskPanel);

	CRect rcFill(rc.left, 0, rc.right, max(rc.bottom, pTaskPanel->GetClientHeight()));

	XTPDrawHelpers()->GradientFill(pDC, rcFill, m_clrBackground, FALSE);

	CXTPTaskPanelItems* pItems = pTaskPanel->GetGroups();
	if (pItems->GetFirstVisibleItem() == NULL)
		return;

	if (m_bRoundedFrame)
	{
		CRect rcFace (((CXTPTaskPanelGroup*)pItems->GetFirstVisibleItem())->GetCaptionRect());
		rcFace.bottom = ((CXTPTaskPanelGroup*)pItems->GetLastVisibleItem())->GetClientRect().bottom;

		rcFace.InflateRect(1, 3, 1, 8);
		CXTPPenDC pen(*pDC, m_groupNormal.clrClientBorder);
		CXTPBrushDC brush(*pDC, m_groupNormal.clrClient);

		pDC->RoundRect(rcFace.left, rcFace.top, rcFace.right, rcFace.bottom, 10, 10);
	}
}

int CXTPTaskPanelPaintManagerPlain::DrawGroupCaption(CDC* pDC, CXTPTaskPanelGroup* pGroup, BOOL bDraw)
{
	CXTPFontDC fnt(pDC, GetItemFont(pGroup));

	if (bDraw)
	{
		CRect rc = pGroup->GetCaptionRect();

		if (rc.IsRectEmpty())
			return 0;

		XTP_TASKPANEL_GROUPCOLORS& groupColors = m_groupNormal;

		if (pGroup->IsCaptionVisible())
		{

			//CRect rcText(rc);
			CRect rcText = DrawCaptionGripper(pDC, pGroup, rc);

			if (!m_bOfficeCaption)
				rcText.DeflateRect(13, 5, 13, 0);

			CSize szIcon = pGroup->GetTaskPanel()->GetGroupIconSize();
			CXTPImageManagerIcon* pImage = pGroup->GetImage(szIcon.cx);

			if (rcText.Width() > szIcon.cx && pImage)
			{
				szIcon.cy = pImage->GetHeight() * szIcon.cx / pImage->GetWidth();

				CRect rcIconPadding(GetItemIconPadding(pGroup));
				CPoint ptIcon(rcText.left + rcIconPadding.left,
					min(rcText.CenterPoint().y + szIcon.cy/2, rcText.bottom) - szIcon.cy - rcIconPadding.bottom + rcIconPadding.top);

				DrawItemImage(pDC, pGroup, ptIcon, pImage, szIcon);

				rcText.left += szIcon.cx + rcIconPadding.right + rcIconPadding.left;
			}


			pDC->SetBkMode(TRANSPARENT);
			pDC->SetTextColor(!pGroup->GetEnabled() ? GetXtremeColor(COLOR_GRAYTEXT) : groupColors.clrClientText);

			DrawItemCaption(pDC, pGroup, rcText, m_nCaptionTextFormat);

			if (m_bOfficeCaption)
			{
				pDC->FillSolidRect(rc.left, rc.bottom - 1, rc.Width(), 1, groupColors.clrHead.clrLight);
			}

			if (pGroup->IsItemFocused() && pGroup->GetTaskPanel()->IsDrawFocusRect())
			{
				CSize szText = pGroup->GetCaptionTextSize(pDC, rcText, m_nCaptionTextFormat);
				DrawFocusRect(pDC, CRect(rcText.TopLeft(), szText));
			}

		}
		return 0;
	}
	else
	{
		if (!pGroup->IsCaptionVisible())
			return 0;

		CRect rcText(pGroup->GetTargetCaptionRect());
		rcText.right -= GetCaptionGripperWidth(pGroup, rcText);

		if (!m_bOfficeCaption)
			rcText.DeflateRect(13, 0, 13, 0);

		rcText.top = rcText.bottom = 0;

		CSize szIcon = pGroup->GetTaskPanel()->GetGroupIconSize();
		CXTPImageManagerIcon* pImage = pGroup->GetImage(szIcon.cx);

		if (pImage)
		{
			CRect rcIconPadding(GetItemIconPadding(pGroup));
			rcText.left += szIcon.cx + rcIconPadding.right + rcIconPadding.left;
		}

		CSize szText = pGroup->GetCaptionTextSize(pDC, rcText, m_nCaptionTextFormat);
		return szText.cy + 5;
	}
}


//////////////////////////////////////////////////////////////////////////
/// CXTPTaskPanelExplorerThemePlain

CXTPTaskPanelExplorerThemePlain::CXTPTaskPanelExplorerThemePlain()
{
	m_bOfficeHighlight = HIGHLIGHT_OFFICE2003;
	m_eGripper = xtpTaskPanelGripperBitmap;
}

CRect CXTPTaskPanelExplorerThemePlain::DrawCaptionGripper(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	if (!m_bExplorerTheme)
		return DrawCaptionGripper(pDC, pGroup, rc);

	if (!pGroup->IsExpandable())
		return rc;

	if (rc.Width() < 20 + 6)
		return rc;


	return DrawCaptionGripperBitmap(pDC, pGroup, pGroup->IsExpanded(), pGroup->IsItemHot(), rc);

}

void CXTPTaskPanelExplorerThemePlain::RefreshMetrics()
{

	CXTPTaskPanelPaintManagerPlain::RefreshMetrics();

	XTPCurrentSystemTheme systemTheme = XTPColorManager()->GetCurrentSystemTheme();

	m_bExplorerTheme = FALSE;
	if (!m_bEmulateEplorerTheme && (systemTheme == xtpSystemThemeUnknown))
	{
		m_eGripper = xtpTaskPanelGripperPlain;
		return ;
	}
	m_bExplorerTheme = TRUE;

	m_groupNormal.clrClientBorder.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
	m_groupSpecial.clrClientBorder.SetStandardValue(GetXtremeColor(COLOR_WINDOW));

	switch (systemTheme)
	{
		case xtpSystemThemeBlue:
		{
			m_clrBackground.SetStandardValue(RGB(123, 162, 231), RGB(99, 117, 214));
			m_groupNormal.clrClient.SetStandardValue(RGB(214, 223, 247));

			m_groupNormal.clrClientLink.SetStandardValue(RGB(33, 93, 198));
			m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(66, 142, 255));
			break;

		}
		case xtpSystemThemeOlive:
		{
			m_clrBackground.SetStandardValue(RGB(204, 217, 173), RGB(165, 189, 132));
			m_groupNormal.clrClient.SetStandardValue(RGB(246, 246, 236));

			m_groupNormal.clrClientLink.SetStandardValue(RGB(86, 102, 45));
			m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(114, 146, 29));

			break;
		}
		case xtpSystemThemeSilver:
		{
			m_clrBackground.SetStandardValue(RGB(196, 200, 212), RGB(177, 179, 200));
			m_groupNormal.clrClient.SetStandardValue(RGB(240, 241, 245));

			m_groupNormal.clrClientLink.SetStandardValue(RGB(63, 61, 61));
			m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(126, 124, 124));

			break;
		}
		default:
		{
			m_clrBackground.SetStandardValue(
				BlendColor(GetXtremeColor(COLOR_INACTIVECAPTION), GetXtremeColor(COLOR_WINDOW), 128),
				BlendColor(GetXtremeColor(COLOR_ACTIVECAPTION), GetXtremeColor(COLOR_WINDOW), 192));


			COLORREF clrClient = BlendColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 24);
			m_groupNormal.clrClient.SetStandardValue(BlendColor(clrClient, GetXtremeColor(COLOR_ACTIVECAPTION), 230));

			m_groupNormal.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
			m_groupNormal.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_HIGHLIGHT));

		}
	}
	m_groupSpecial = m_groupNormal;

	CreateGripperBitmaps();

}


//////////////////////////////////////////////////////////////////////////
/// CXTPTaskPanelOfficeXPThemePlain

CXTPTaskPanelOfficeXPThemePlain::CXTPTaskPanelOfficeXPThemePlain()
{
	m_bRoundedFrame = FALSE;
	m_bOfficeCaption = TRUE;
	m_bOfficeHighlight = TRUE;
	m_eGripper = xtpTaskPanelGripperNone;
}

void CXTPTaskPanelOfficeXPThemePlain::RefreshMetrics()
{
	CXTPTaskPanelPaintManagerPlain::RefreshMetrics();

	COLORREF clrBackground = GetXtremeColor(XPCOLOR_MENUBAR_FACE);
	COLORREF clr3DShadow = GetXtremeColor(COLOR_3DSHADOW);

	m_clrBackground.SetStandardValue(clrBackground, clrBackground);

	m_groupNormal.clrClient.SetStandardValue(clrBackground);
	m_groupNormal.clrHead.SetStandardValue(clr3DShadow, clr3DShadow);
	m_groupNormal.clrClientLink.SetStandardValue(RGB(0, 0, 0xFF));
	m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(0, 0, 0xFF));

	m_groupSpecial = m_groupNormal;

}


//////////////////////////////////////////////////////////////////////////
/// CXTPTaskPanelOffice2003ThemePlain

CXTPTaskPanelOffice2003ThemePlain::CXTPTaskPanelOffice2003ThemePlain()
{
	m_bOfficeHighlight = HIGHLIGHT_OFFICE2003;
	m_rcControlMargins = CRect(8, 8, 0, 8);
	m_nGroupSpacing = 15;
	m_eGripper = xtpTaskPanelGripperNone;
}

void CXTPTaskPanelOffice2003ThemePlain::RefreshMetrics()
{
	CXTPTaskPanelOfficeXPThemePlain::RefreshMetrics();

	XTPCurrentSystemTheme systemTheme = XTPColorManager()->GetCurrentSystemTheme();

	COLORREF clrBackground;
	COLORREF clr3DShadow;

	switch (systemTheme)
	{
		case xtpSystemThemeBlue:
		case xtpSystemThemeRoyale:
		case xtpSystemThemeAero:
			clrBackground = RGB(221, 236, 254);
			clr3DShadow = RGB(123, 164, 224);
			break;

		case xtpSystemThemeOlive:
			clrBackground = RGB(243, 242, 231);
			clr3DShadow = RGB(188, 187, 177);
			break;

		case xtpSystemThemeSilver:
			clrBackground = RGB(238, 238, 244);
			clr3DShadow = RGB(161, 160, 187);
			break;

		default:
			clrBackground = XTPColorManager()->LightColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 50);
			clr3DShadow = GetXtremeColor(COLOR_3DSHADOW);
	}

	m_clrBackground.SetStandardValue(clrBackground, clrBackground);

	m_groupNormal.clrClient.SetStandardValue(clrBackground);
	m_groupNormal.clrHead.SetStandardValue(clr3DShadow, clr3DShadow);
	m_groupNormal.clrClientLink.SetStandardValue(RGB(0, 0, 0xFF));
	m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(0, 0, 0xFF));

	m_groupSpecial = m_groupNormal;

}



//////////////////////////////////////////////////////////////////////////
// CXTPTaskPanelToolboxTheme


CXTPTaskPanelToolboxTheme::CXTPTaskPanelToolboxTheme()
{
	m_bBoldCaption = FALSE;
	m_bRoundedFrame = FALSE;
	m_bOfficeHighlight = FALSE;
	m_bInvertDragRect = TRUE;
	m_bCaptionScrollButton = TRUE;
	m_eGripper = xtpTaskPanelGripperNone;

	m_rcGroupInnerMargins = CRect(0, 4, 0, 2);
	m_rcControlMargins = CRect(2, 2, 2, 2);
	m_nGroupSpacing = 1;
	m_rcGroupIconPadding.SetRect(2, 2, 0, 2);

	m_nCaptionTextFormat = DT_SINGLELINE | DT_VCENTER | DT_LEFT | DT_END_ELLIPSIS;
}

void CXTPTaskPanelToolboxTheme::RefreshMetrics()
{
	CXTPTaskPanelPaintManager::RefreshMetrics();

	m_clrBackground.SetStandardValue(GetXtremeColor(COLOR_3DFACE));
	m_groupNormal.clrClient.SetStandardValue(GetXtremeColor(COLOR_3DFACE));
	m_groupNormal.clrClientBorder.SetStandardValue(GetXtremeColor(COLOR_3DFACE));

	m_groupNormal.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
	m_groupNormal.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_HIGHLIGHT));
	m_groupNormal.clrHead.SetStandardValue(GetXtremeColor(COLOR_3DFACE));
	m_groupNormal.clrHeadTextNormal.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
	m_groupNormal.clrHeadTextHot.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));

	m_groupSpecial = m_groupNormal;

	CWindowDC dc(CWnd::GetDesktopWindow());
	CXTPFontDC fnt(&dc, &m_fntCaption);
	m_nCaptionHeight = max(18, dc.GetTextExtent(_T(" "), 1).cy + 5);

	if (!m_bOfficeHighlight)
	{
		COLORREF clr3DFace = GetXtremeColor(COLOR_3DFACE);
		COLORREF clr3DHightlight = GetXtremeColor(COLOR_3DHIGHLIGHT);

		int r = GetRValue(clr3DFace), g = GetGValue(clr3DFace), b = GetBValue(clr3DFace);
		int nDelta = max(max(r, g), b);
		if (r < nDelta) nDelta = min(min(r, g), b);

		m_clrHighlightHot.SetStandardValue(RGB(
			(r + GetRValue(clr3DHightlight))/2,
			(2 * g - nDelta + GetGValue(clr3DHightlight))/2,
			(2 * b - nDelta + GetBValue(clr3DHightlight))/2));
		m_clrHighlightBorder.SetStandardValue(GetXtremeColor(COLOR_3DSHADOW), GetXtremeColor(COLOR_3DHIGHLIGHT));
	}
}

CRect CXTPTaskPanelToolboxTheme::DrawGroupCaptionBackground(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	COLORREF clrFace = GetGroupColors(pGroup)->clrHead.clrDark;

	CRect rcText(rc);
	pDC->FillSolidRect(rc, clrFace);

	if (pGroup->IsItemHot() && pGroup->IsItemPressed())
	{
		pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DDKSHADOW), GetXtremeColor(COLOR_3DHILIGHT));
		rc.DeflateRect(1, 1);
		pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DSHADOW), clrFace);
		rcText.OffsetRect(1, 1);

	}
	else
	{
		pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DHILIGHT), GetXtremeColor(COLOR_3DSHADOW));
	}
	return rcText;
}

int CXTPTaskPanelToolboxTheme::DrawGroupCaption(CDC* pDC, CXTPTaskPanelGroup* pGroup, BOOL bDraw)
{
	CXTPFontDC fnt(pDC, GetItemFont(pGroup));

	if (bDraw)
	{
		CRect rc = pGroup->GetCaptionRect();

		if (rc.IsRectEmpty())
			return 0;

		XTP_TASKPANEL_GROUPCOLORS* pGroupColors = GetGroupColors(pGroup);

		if (pGroup->IsCaptionVisible())
		{
			CRect rcText = DrawGroupCaptionBackground(pDC, pGroup, rc);

			rcText = DrawCaptionGripper(pDC, pGroup, rcText);

			CSize szIcon = pGroup->GetTaskPanel()->GetGroupIconSize();
			CXTPImageManagerIcon* pImage = pGroup->GetImage(szIcon.cx);

			if (rcText.Width() > szIcon.cx && pImage)
			{
				szIcon.cy = pImage->GetHeight() * szIcon.cx / pImage->GetWidth();

				CRect rcIconPadding(GetItemIconPadding(pGroup));
				CPoint ptIcon(rcText.left + rcIconPadding.left,
					min(rcText.CenterPoint().y + szIcon.cy/2, rcText.bottom) - szIcon.cy - rcIconPadding.bottom + rcIconPadding.top);

				DrawItemImage(pDC, pGroup, ptIcon, pImage, szIcon);

				rcText.left += szIcon.cx + rcIconPadding.right + rcIconPadding.left;
			}

			rcText.DeflateRect(3, 0);

			pDC->SetBkMode(TRANSPARENT);
			pDC->SetTextColor(!pGroup->GetEnabled() ? GetXtremeColor(COLOR_GRAYTEXT) : pGroupColors->clrHeadTextNormal);
			DrawItemCaption(pDC, pGroup, rcText, m_nCaptionTextFormat);

			if (pGroup->IsItemDragging())
			{
				pDC->InvertRect(rc);
			}

			if (pGroup->IsItemDragOver() && (m_bInvertDragRect || !(pGroup->IsExpanded() && pGroup->GetItems()->GetFirstVisibleItem() != NULL)))
			{
				DrawDragArrow(pDC, pGroup, rc, TRUE);
			}

			if (pGroup->IsChildItemDragOver() && m_bInvertDragRect)
			{
				pDC->InvertRect(rc);
			}


			if (pGroup->IsItemFocused() && pGroup->GetTaskPanel()->IsDrawFocusRect())
			{
				rcText.DeflateRect(-1, 2);
				DrawFocusRect(pDC, rcText);
			}

		}
		return 0;
	}
	else
	{
		if (!pGroup->IsCaptionVisible())
			return 0;

		int nIconSize = 0;

		CSize szIcon = pGroup->GetTaskPanel()->GetGroupIconSize();
		CXTPImageManagerIcon* pImage = pGroup->GetImage(szIcon.cx);

		if (pImage)
		{
			CRect rcIconPadding(GetItemIconPadding(pGroup));
			nIconSize = pImage->GetHeight() * szIcon.cx / pImage->GetWidth()
				+ rcIconPadding.top + rcIconPadding.bottom;
		}

		return max(m_nCaptionHeight, nIconSize);
	}
}


//////////////////////////////////////////////////////////////////////////
// CXTPTaskPanelToolboxWhidbeyTheme

CXTPTaskPanelToolboxWhidbeyTheme::CXTPTaskPanelToolboxWhidbeyTheme()
{
	m_bOfficeHighlight = TRUE;
	m_bBoldCaption = TRUE;
	m_bInvertDragRect = FALSE;
	m_bCaptionScrollButton = FALSE;
}

void CXTPTaskPanelToolboxWhidbeyTheme::RefreshMetrics()
{
	CXTPTaskPanelToolboxTheme::RefreshMetrics();

	m_clrBackground.SetStandardValue(GetXtremeColor(COLOR_3DFACE));

	switch (XTPColorManager()->GetCurrentSystemTheme())
	{
	case xtpSystemThemeBlue:
		m_groupNormal.clrHead.SetStandardValue(RGB(222, 220, 203), RGB(196, 193, 176));
		m_clrBackground.SetStandardValue(RGB(243, 241, 230), RGB(228, 225, 208));
		break;

	case xtpSystemThemeOlive:
		m_groupNormal.clrHead.SetStandardValue(RGB(223, 228, 209), RGB(222, 227, 206));
		m_clrBackground.SetStandardValue(RGB(243, 241, 230), RGB(228, 225, 208));
		m_clrHighlightHot.SetStandardValue(RGB(182, 198, 141));
		m_clrHighlightPressed.SetStandardValue(RGB(147, 160, 112));
		m_clrHighlightSelected.SetStandardValue(RGB(194, 207, 158));
		break;

	case xtpSystemThemeSilver:
		m_groupNormal.clrHead.SetStandardValue(RGB(233, 232, 237), RGB(223, 224, 227));
		m_clrBackground.SetStandardValue(RGB(234, 233, 238), RGB(215, 213, 218));
		m_clrHighlightHot.SetStandardValue(RGB(255, 238, 194));
		m_clrHighlightPressed.SetStandardValue(RGB(254, 128, 062));
		m_clrHighlightSelected.SetStandardValue(RGB(255, 192, 111));
		m_clrHighlightBorder.SetStandardValue(RGB(75, 75, 111));
		break;

	default:
		m_groupNormal.clrHead.SetStandardValue(GetXtremeColor(COLOR_3DSHADOW), GetXtremeColor(COLOR_3DFACE));
	}

	m_groupNormal.clrClient.SetStandardValue(m_clrBackground);

	m_groupSpecial = m_groupNormal;

}


CRect  CXTPTaskPanelToolboxWhidbeyTheme::DrawExpandButton(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	XTP_TASKPANEL_GROUPCOLORS* pGroupColors = GetGroupColors(pGroup);
	COLORREF clrFace = pGroupColors->clrHead.clrLight;

	CRect rcButton(rc.left + 6, rc.CenterPoint().y - 6, rc.left + 6 + 9, rc.CenterPoint().y + 3);

	COLORREF clrButton = clrFace;
	COLORREF clrFrame = GetXtremeColor(COLOR_3DSHADOW);
	pDC->FillSolidRect(rcButton, clrButton);
	pDC->FillSolidRect(rcButton.left + 1, rcButton.top + 1, rcButton.Width() - 2, rcButton.Height() - 2, GetXtremeColor(COLOR_3DFACE));
	pDC->FillSolidRect(rcButton.left + 1, rcButton.top, rcButton.Width() - 2, 1, clrFrame);
	pDC->FillSolidRect(rcButton.left + 1, rcButton.bottom - 1, rcButton.Width() - 2, 1, clrFrame);
	pDC->FillSolidRect(rcButton.left, rcButton.top + 1, 1, rcButton.Height() - 2, clrFrame);
	pDC->FillSolidRect(rcButton.right - 1, rcButton.top + 1, 1, rcButton.Height() - 2, clrFrame);
	pDC->FillSolidRect(rcButton.left + 1, rcButton.top + 1, rcButton.Width() - 2, 3, 0xFFFFFF);
	pDC->FillSolidRect(rcButton.left + 1, rcButton.top + 4, rcButton.Width() - 4, 2, 0xFFFFFF);

	pDC->FillSolidRect(rcButton.left + 2, rcButton.top + 4, rcButton.Width() - 4, 1, 0);
	if (!pGroup->IsExpanded())
		pDC->FillSolidRect(rcButton.left + 4, rcButton.top + 2, 1, rcButton.Height() - 4, 0);

	CRect rcText(rc);
	rcText.DeflateRect(19, 0, 0, 2);

	return rcText;
}

CRect CXTPTaskPanelToolboxWhidbeyTheme::DrawGroupCaptionBackground(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	XTP_TASKPANEL_GROUPCOLORS* pGroupColors = GetGroupColors(pGroup);
	COLORREF clrFace = pGroupColors->clrHead.clrLight;

	if (pGroup->IsItemFocused())
	{
		if (!pGroup->IsItemHot() && !pGroup->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightSelected);
		else if (pGroup->IsItemHot() && !pGroup->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightPressed);
		else if (pGroup->IsItemHot() && pGroup->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightPressed);
		else if (pGroup->IsItemHot() || pGroup->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightHot);

	}
	else
	{
		XTPDrawHelpers()->GradientFill(pDC,
			CRect(rc.left, rc.top, rc.right, rc.bottom - 2), pGroupColors->clrHead, FALSE);

		pDC->FillSolidRect(rc.left, rc.bottom - 1, rc.Width(), 1, clrFace);
	}

	return DrawExpandButton(pDC, pGroup, rc);
}

void CXTPTaskPanelToolboxWhidbeyTheme::FillTaskPanel(CDC* pDC, CXTPTaskPanel* pTaskPanel)
{
	CXTPClientRect rc(pTaskPanel);
	CRect rcFill(rc.left, 0, rc.right, max(rc.bottom, pTaskPanel->GetClientHeight()));

	XTPDrawHelpers()->GradientFill(pDC, rcFill, m_clrBackground, TRUE);
}

void CXTPTaskPanelToolboxWhidbeyTheme::FillGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	XTPDrawHelpers()->GradientFill(pDC, rc, GetGroupColors(pGroup)->clrClient, TRUE);
}

void CXTPTaskPanelToolboxWhidbeyTheme::DrawGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	DrawGroupClientItems(pDC, pGroup, rc);
}



//////////////////////////////////////////////////////////////////////////
// CXTPTaskPanelVisualStudio2010Theme

CXTPTaskPanelVisualStudio2010Theme::CXTPTaskPanelVisualStudio2010Theme()
{
	m_bOfficeHighlight = TRUE;
	m_bBoldCaption = FALSE;
	m_bInvertDragRect = FALSE;
	m_bCaptionScrollButton = FALSE;

	m_themeTreeExplorer = new CXTPWinThemeWrapper();
}

CXTPTaskPanelVisualStudio2010Theme::~CXTPTaskPanelVisualStudio2010Theme()
{
	SAFE_DELETE(m_themeTreeExplorer);
}

void CXTPTaskPanelVisualStudio2010Theme::RefreshMetrics()
{
	CXTPTaskPanelToolboxWhidbeyTheme::RefreshMetrics();

	m_clrBackground.SetStandardValue(RGB(255, 255, 255));

	m_groupNormal.clrHead.SetStandardValue(RGB(240,240,240), RGB(240,240,240));
	m_clrBackground.SetStandardValue(RGB(255, 255, 255));

	m_groupNormal.clrClient.SetStandardValue(m_clrBackground);

	m_groupSpecial = m_groupNormal;

	m_clrHighlightBorder.SetStandardValue(RGB(229, 195, 101));


	m_clrHighlightSelected.SetStandardValue(RGB(255,239,187));
	m_clrHighlightPressed = m_clrHighlightSelected;
	m_clrHighlightHot = m_clrHighlightSelected;


	m_themeTreeExplorer->CloseThemeData();

	if (XTPSystemVersion()->IsWinVistaOrGreater())
	{
		CWnd wnd;
		if (wnd.CreateEx(0, AfxRegisterWndClass(0), NULL, WS_POPUP, CRect(0, 0, 0, 0), 0, 0))
		{
			CXTPWinThemeWrapper().SetWindowTheme(wnd, L"EXPLORER", NULL);

			m_themeTreeExplorer->OpenThemeData(wnd, L"TREEVIEW");
		}
	}
}

CRect CXTPTaskPanelVisualStudio2010Theme::DrawGroupCaptionBackground(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	XTP_TASKPANEL_GROUPCOLORS* pGroupColors = GetGroupColors(pGroup);

	CRect rcText(rc);
	if (pGroup->IsItemFocused())
	{
		if (XTPSystemVersion()->IsWinVistaOrGreater())
		{
			XTPDrawHelpers()->GradientFill(pDC,
				CRect(rc.left, rc.top, rc.right, rc.bottom), RGB(255, 250, 239), RGB(255, 242, 203), FALSE);

			pDC->Draw3dRect(rc, m_clrHighlightBorder, m_clrHighlightBorder);
		}
		else
		{
			if (!pGroup->IsItemHot() && !pGroup->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightSelected);
			else if (pGroup->IsItemHot() && !pGroup->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightPressed);
			else if (pGroup->IsItemHot() && pGroup->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightPressed);
			else if (pGroup->IsItemHot() || pGroup->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightHot);
		}
	}
	else
	{
		XTPDrawHelpers()->GradientFill(pDC,
			CRect(rc.left, rc.top, rc.right, rc.bottom), pGroupColors->clrHead, FALSE);
		pDC->Draw3dRect(rc, RGB(206,212,223), RGB(206,212,223));
	}

	return DrawExpandButton(pDC, pGroup, rc);
}

void CXTPTaskPanelVisualStudio2010Theme::FillTaskPanel(CDC* pDC, CXTPTaskPanel* pTaskPanel)
{
	CXTPClientRect rc(pTaskPanel);
	CRect rcFill(rc.left, 0, rc.right, max(rc.bottom, pTaskPanel->GetClientHeight()));

	XTPDrawHelpers()->GradientFill(pDC, rcFill, m_clrBackground, TRUE);
}

void CXTPTaskPanelVisualStudio2010Theme::FillGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	XTPDrawHelpers()->GradientFill(pDC, rc, GetGroupColors(pGroup)->clrClient, TRUE);
}

void CXTPTaskPanelVisualStudio2010Theme::DrawGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	DrawGroupClientItems(pDC, pGroup, rc);
}


CRect  CXTPTaskPanelVisualStudio2010Theme::DrawExpandButton(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	if (m_themeTreeExplorer->IsAppThemed())
	{
		CRect rcButton(rc.left + 1, rc.CenterPoint().y - 8, rc.left + 1 + 16, rc.CenterPoint().y + 8);

		m_themeTreeExplorer->DrawThemeBackground(*pDC, TVP_GLYPH, pGroup->IsExpanded() ? GLPS_OPENED : GLPS_CLOSED, &rcButton, 0);

		CRect rcText(rc);
		rcText.DeflateRect(16, 0, 0, 2);

		return rcText;
	}

	return CXTPTaskPanelToolboxWhidbeyTheme::DrawExpandButton(pDC, pGroup, rc);
}


//////////////////////////////////////////////////////////////////////////
// CXTPTaskPanelListViewTheme
CXTPTaskPanelListViewTheme::CXTPTaskPanelListViewTheme()
{
	m_rcGroupInnerMargins.SetRect(8, 6, 8, 6);
	m_rcControlMargins.SetRectEmpty();
	m_nGroupSpacing = 0;
	m_bOfficeHighlight = FALSE;
	m_bInvertDragRect = FALSE;
	m_bCaptionScrollButton = FALSE;
	m_bEmbossedDisabledText = TRUE;
}

void CXTPTaskPanelListViewTheme::RefreshMetrics()
{
	CXTPTaskPanelToolboxTheme::RefreshMetrics();

	m_clrBackground.SetStandardValue(GetXtremeColor(COLOR_3DSHADOW));
	m_groupNormal.clrClient.SetStandardValue(GetXtremeColor(COLOR_3DSHADOW));
	m_groupNormal.clrClientText.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
	m_groupNormal.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
	m_groupNormal.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
	m_groupNormal.clrClientLinkSelected.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
	m_nCaptionHeight = max(20, m_nCaptionHeight);

	if (!m_bOfficeHighlight)
	{
		m_clrHighlightHot.SetStandardValue(GetXtremeColor(COLOR_3DSHADOW));
		m_clrHighlightBorder.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT), GetXtremeColor(COLOR_3DFACE));
	}
	m_groupSpecial = m_groupNormal;
}


//////////////////////////////////////////////////////////////////////////
// CXTPTaskPanelListViewOfficeXPTheme

CXTPTaskPanelListViewOfficeXPTheme::CXTPTaskPanelListViewOfficeXPTheme()
{
	m_bOfficeHighlight = TRUE;
	m_bEmbossedDisabledText = FALSE;
}

void CXTPTaskPanelListViewOfficeXPTheme::RefreshMetrics()
{
	CXTPTaskPanelListViewTheme::RefreshMetrics();

	m_clrBackground.SetStandardValue(GetXtremeColor(XPCOLOR_TOOLBAR_FACE));
	m_groupNormal.clrClient.SetStandardValue(GetXtremeColor(XPCOLOR_TOOLBAR_FACE));
	m_groupNormal.clrClientText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
	m_groupNormal.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
	m_groupNormal.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
	m_groupNormal.clrClientLinkSelected.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT_TEXT));
	m_nCaptionHeight = max(20, m_nCaptionHeight);
	m_groupSpecial = m_groupNormal;
}

//////////////////////////////////////////////////////////////////////////
// CXTPTaskPanelListViewOffice2003Theme

CXTPTaskPanelListViewOffice2003Theme::CXTPTaskPanelListViewOffice2003Theme()
{
	m_bOfficeHighlight = HIGHLIGHT_OFFICE2003;
	m_bEmbossedDisabledText = FALSE;
}

void CXTPTaskPanelListViewOffice2003Theme::RefreshMetrics()
{
	CXTPTaskPanelListViewOfficeXPTheme::RefreshMetrics();

	m_grcPushed.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT_PUSHED));
	m_grcHot.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT));

	if (!XTPColorManager()->IsLunaColorsDisabled())
	{
		XTPCurrentSystemTheme systemTheme = XTPColorManager()->GetCurrentSystemTheme();

		switch (systemTheme)
		{
		case xtpSystemThemeBlue:
		case xtpSystemThemeRoyale:
		case xtpSystemThemeAero:
			m_clrBackground.SetStandardValue(RGB(216, 231, 252));
			m_groupNormal.clrClient.SetStandardValue(RGB(216, 231, 252));
			break;
		case xtpSystemThemeOlive:
			m_clrBackground.SetStandardValue(RGB(226, 231, 191));
			m_groupNormal.clrClient.SetStandardValue(RGB(226, 231, 191));
			break;
		case xtpSystemThemeSilver:
			m_clrBackground.SetStandardValue(RGB(223, 223, 234));
			m_groupNormal.clrClient.SetStandardValue(RGB(223, 223, 234));
			break;
		}

		if (systemTheme != xtpSystemThemeUnknown)
		{
			m_grcPushed.SetStandardValue(RGB(232, 127, 8), RGB(247, 218, 124));
			m_grcHot.SetStandardValue(RGB(255, 255, 220), RGB(247, 192, 91));
		}
	}
	m_groupNormal.clrHead.SetStandardValue(XTPColorManager()->grcDockBar.clrDark, XTPColorManager()->grcDockBar.clrLight);
	m_groupSpecial = m_groupNormal;
}

CRect CXTPTaskPanelListViewOffice2003Theme::DrawGroupCaptionBackground(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	if (pGroup->IsItemHot() || pGroup->IsItemPressed())
	{
		XTPDrawHelpers()->GradientFill(pDC, rc, pGroup->IsItemPressed() ? m_grcPushed : m_grcHot, FALSE);
	}
	else
	{
		XTPDrawHelpers()->GradientFill(pDC, rc, GetGroupColors(pGroup)->clrHead, FALSE);
	}


	pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DHILIGHT), GetXtremeColor(XPCOLOR_FRAME));



	return rc;
}

//////////////////////////////////////////////////////////////////////////
// CXTPTaskPanelShortcutBarOffice2003Theme

CXTPTaskPanelShortcutBarOffice2003Theme::CXTPTaskPanelShortcutBarOffice2003Theme()
{
	m_nCaptionTextFormat = DT_SINGLELINE | DT_VCENTER | DT_CENTER | DT_END_ELLIPSIS;
}

void CXTPTaskPanelShortcutBarOffice2003Theme::RefreshMetrics()
{
	CXTPTaskPanelListViewOffice2003Theme::RefreshMetrics();

	CWindowDC dc(CWnd::GetDesktopWindow());
	CXTPFontDC fnt(&dc, &m_fntCaption);
	m_nCaptionHeight = max(22, dc.GetTextExtent(_T(" "), 1).cy + 3);

	m_groupNormal.clrClient.SetStandardValue(XTPColorManager()->grcCaption);
	m_groupNormal.clrClientText.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
	m_groupNormal.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
	m_groupNormal.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_WINDOW));

	m_groupNormal.clrHead.SetStandardValue(XTPColorManager()->grcToolBar);
	m_clrBackground.SetStandardValue(XTPColorManager()->grcCaption);

	m_groupSpecial = m_groupNormal;
}

CRect CXTPTaskPanelShortcutBarOffice2003Theme::DrawGroupCaptionBackground(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	if (pGroup->IsItemHot() || pGroup->IsItemPressed())
	{
		XTPDrawHelpers()->GradientFill(pDC, rc, pGroup->IsItemPressed() ? m_grcPushed : m_grcHot, FALSE);
	}
	else
	{
		XTPDrawHelpers()->GradientFill(pDC, rc, GetGroupColors(pGroup)->clrHead, FALSE);
	}

	if (pGroup->GetIndex() != 0)
		pDC->FillSolidRect(rc.left, rc.top, rc.Width(), 1, GetXtremeColor(XPCOLOR_FRAME));

	return rc;
}

void CXTPTaskPanelShortcutBarOffice2003Theme::FillGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	XTPDrawHelpers()->GradientFill(pDC, rc, GetGroupColors(pGroup)->clrClient, FALSE);
}

void CXTPTaskPanelShortcutBarOffice2003Theme::DrawGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	DrawGroupClientItems(pDC, pGroup, rc);

	pDC->FillSolidRect(rc.left, rc.top, rc.Width(), 1, GetXtremeColor(XPCOLOR_FRAME));
}

void CXTPTaskPanelShortcutBarOffice2003Theme::FillTaskPanel(CDC* pDC, CXTPTaskPanel* pTaskPanel)
{
	CXTPClientRect rc(pTaskPanel);
	rc.bottom = max(rc.bottom, pTaskPanel->GetClientHeight());

	XTPDrawHelpers()->GradientFill(pDC, rc, m_clrBackground, FALSE);
}

//////////////////////////////////////////////////////////////////////////
// CXTPTaskPanelShortcutBarOffice2007Theme

CXTPTaskPanelShortcutBarOffice2007Theme::CXTPTaskPanelShortcutBarOffice2007Theme()
{
	m_nCaptionTextFormat = DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
	m_bBoldCaption = TRUE;
}

void CXTPTaskPanelShortcutBarOffice2007Theme::RefreshMetrics()
{
	CXTPTaskPanelShortcutBarOffice2003Theme::RefreshMetrics();

	CWindowDC dc(CWnd::GetDesktopWindow());
	CXTPFontDC fnt(&dc, &m_fntCaption);
	m_nCaptionHeight = max(22, dc.GetTextExtent(_T(" "), 1).cy + 3);

	m_groupNormal.clrClient.SetStandardValue(0xFFFFFF);

	m_groupNormal.clrHead.SetStandardValue(RGB(227, 239, 255), RGB(192, 219, 255), 0.25f);

	CXTPResourceImages* pImages = XTPResourceImages();

	m_bPlainStyle = pImages->GetImageInt(_T("ShortcutBar"), _T("FlatStyle"), FALSE);
	m_clrBackground.SetStandardValue(0xFFFFFF);

	if (m_bPlainStyle)
	{
		m_clrBackground.SetStandardValue(pImages->GetImageColor(_T("ShortcutBar"), _T("FlatBackground")));
		m_groupNormal.clrClient.SetStandardValue(m_clrBackground);
	}

	m_groupSpecial = m_groupNormal;

	CXTPResourceImage* pImage = pImages->LoadFile(_T("SHORTCUTBARITEMS"));
	if (pImage)
	{
		m_clrShortcutItemShadow = pImages->GetImageColor(_T("ShortcutBar"), _T("FrameBorder"));

		COLORREF clrText = pImages->GetImageColor(_T("ShortcutBar"), _T("NormalText"));
		m_groupNormal.clrHeadTextNormal.SetStandardValue(clrText);
		m_groupNormal.clrHeadTextHot.SetStandardValue(clrText);
	}
	else
	{
		m_clrShortcutItemShadow = RGB(101, 147, 207);

		m_groupNormal.clrHeadTextNormal.SetStandardValue(RGB(32, 77, 137));
		m_groupNormal.clrHeadTextHot.SetStandardValue(RGB(32, 77, 137));
	}
	m_groupNormal.clrClientText.SetStandardValue(m_groupNormal.clrHeadTextNormal);
	m_groupNormal.clrClientLink.SetStandardValue(m_groupNormal.clrHeadTextNormal);
	m_groupNormal.clrClientLinkHot.SetStandardValue(m_groupNormal.clrHeadTextNormal);

	m_grcPushed.SetStandardValue(RGB(232, 127, 8), RGB(247, 218, 124));
	m_grcHot.SetStandardValue(RGB(255, 255, 220), RGB(247, 192, 91));
	m_groupNormal.clrHead.SetStandardValue(RGB(227, 239, 255), RGB(192, 219, 255), 0.25f);

	m_clrHighlightHot.SetStandardValue(RGB(255, 231, 162));
	m_clrHighlightPressed.SetStandardValue(RGB(255, 171, 63));
	m_clrHighlightSelected.SetStandardValue(RGB(255,189,105));
	m_clrHighlightBorder.SetStandardValue(RGB(255, 171, 63));

	m_groupSpecial = m_groupNormal;
}

CRect CXTPTaskPanelShortcutBarOffice2007Theme::DrawGroupCaptionBackground(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	CXTPResourceImages* pImages = XTPResourceImages();


	CXTPResourceImage* pImage = 0;

	if (m_bPlainStyle)
		pImage = pImages->LoadFile(_T("SHORTCUTBARSMALLITEMS"));

	if (!pImage)
		pImage = pImages->LoadFile(_T("SHORTCUTBARITEMS"));

	if (!pImage)
		return CXTPTaskPanelShortcutBarOffice2003Theme::DrawGroupCaptionBackground(pDC, pGroup, rc);

	if (m_bPlainStyle)
	{
		if (pGroup->IsItemPressed())
		{
			pImage->DrawImage(pDC, rc, pImage->GetSource(3, 4), CRect(2, 2, 2, 2));
		}
		else if (pGroup->IsItemHot())
		{
			pImage->DrawImage(pDC, rc, pImage->GetSource(2, 4), CRect(2, 2, 2, 2));
		}
	}
	else
	{
		if (pGroup->IsItemPressed())
		{
			pImage->DrawImage(pDC, rc, pImage->GetSource(3, 4), CRect(2, 2, 2, 2));
		}
		else if (pGroup->IsItemHot())
		{
			pImage->DrawImage(pDC, rc, pImage->GetSource(2, 4), CRect(2, 2, 2, 2));
		}
		else
		{
			pImage->DrawImage(pDC, rc, pImage->GetSource(0, 4), CRect(2, 2, 2, 2));
		}
		pDC->FillSolidRect(rc.left, rc.bottom - 1, rc.Width(), 1, m_clrShortcutItemShadow);
	}


	return rc;
}

void CXTPTaskPanelShortcutBarOffice2007Theme::FillGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	XTPDrawHelpers()->GradientFill(pDC, rc, GetGroupColors(pGroup)->clrClient, FALSE);
}

void CXTPTaskPanelShortcutBarOffice2007Theme::DrawGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
{
	DrawGroupClientItems(pDC, pGroup, rc);

	if (pGroup->GetParentItems()->GetLastVisibleItem() != pGroup)
		pDC->FillSolidRect(rc.left, rc.bottom - 1, rc.Width(), 1, m_clrShortcutItemShadow);
}

void CXTPTaskPanelShortcutBarOffice2007Theme::FillTaskPanel(CDC* pDC, CXTPTaskPanel* pTaskPanel)
{
	CXTPClientRect rc(pTaskPanel);
	rc.bottom = max(rc.bottom, pTaskPanel->GetClientHeight());

	XTPDrawHelpers()->GradientFill(pDC, rc, m_clrBackground, FALSE);
}

void CXTPTaskPanelShortcutBarOffice2007Theme::DrawGroupItemFrame(CDC* pDC, CXTPTaskPanelGroupItem* pItem, CRect rc)
{
	CXTPResourceImages* pImages = XTPResourceImages();

	CXTPResourceImage* pImage = pImages->LoadFile(rc.Height() > 22 ? _T("TOOLBARBUTTONS50") : _T("TOOLBARBUTTONS22"));
	if (!pImage)
	{
		CXTPTaskPanelShortcutBarOffice2003Theme::DrawGroupItemFrame(pDC, pItem, rc);
		return;
	}

	int nState = -1;

	if (pItem->IsItemSelected() && !pItem->IsItemHot() && !pItem->IsItemPressed()) nState = 2;
	else if (pItem->IsItemSelected() && pItem->IsItemHot() && !pItem->IsItemPressed())  nState = 3;
	else if (pItem->IsItemHot() && pItem->IsItemPressed()) nState = 1;
	else if (pItem->IsItemHot() || pItem->IsItemPressed()) nState = 0;

	if (nState != -1)
	{
		pImage->DrawImage(pDC, rc, pImage->GetSource(nState, 4), CRect(8, 8, 8, 8), COLORREF_NULL);
	}
}