// XTPDockingPanePaintManager.cpp : implementation of the CXTPDockingPanePaintManager class.
//
// This file is a part of the XTREME DOCKINGPANE 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/XTPColorManager.h"
#include "Common/XTPDrawHelpers.h"
#include "Common/XTPResourceImage.h"
#include "Common/XTPResourceManager.h"
#include "Common/XTPWinThemeWrapper.h"
#include "Common/XTPImageManager.h"
#include "Common/XTPSystemHelpers.h"

#include "TabManager/XTPTabManager.h"
#include "TabManager/XTPTabPaintManager.h"

#include "XTPDockingPaneDefines.h"
#include "XTPDockingPaneBase.h"
#include "XTPDockingPaneBaseContainer.h"
#include "XTPDockingPanePaintManager.h"
#include "XTPDockingPaneTabbedContainer.h"
#include "XTPDockingPane.h"
#include "XTPDockingPaneMiniWnd.h"
#include "XTPDockingPaneSplitterContainer.h"
#include "XTPDockingPaneSidePanel.h"

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


BOOL CXTPDockingPaneCaptionButton::IsVisible()
{
	return m_pPane->IsCaptionButtonVisible(this);
}

AFX_INLINE void XTPDeflateRectDirection(CRect& rc, int left, int top, int right, int bottom, BOOL bVertical)
{
	if (bVertical)
	{
		rc.DeflateRect(top, left, bottom, right);
	}
	else
	{
		rc.DeflateRect(left, top, right, bottom);
	}
}

AFX_INLINE int XTPGetRectDirectionHeight(const CRect& rc, BOOL bVertical)
{
	return bVertical ? rc.Width() : rc.Height();
}

void XTPFillFramePartRect(CDC* pDC, CRect rc, CWnd* pWnd, CWnd* pParentFrame, const CXTPPaintManagerColorGradient& clrHeaderFace, BOOL bHoriz)
{
	COLORREF clrLight = clrHeaderFace.clrDark, clrDark = clrHeaderFace.clrLight;

	CWnd* pFrame = pParentFrame;

	if (XTPColorManager()->IsLowResolution())
	{
		pDC->FillSolidRect(rc, clrDark);
		return;
	}

	if (pFrame)
	{
		CRect rcFrame;
		pFrame->GetWindowRect(&rcFrame);
		pWnd->ScreenToClient(&rcFrame);

		if (bHoriz)
		{
			float fWidth = (float)max(rcFrame.Width(), GetSystemMetrics(SM_CXFULLSCREEN)/ 2);

			COLORREF clr1 = XTPDrawHelpers()->BlendColors(clrLight, clrDark, float(rc.left - rcFrame.left) / fWidth);
			COLORREF clr2 = XTPDrawHelpers()->BlendColors(clrLight, clrDark, float(rc.right - rcFrame.left) / fWidth);

			XTPDrawHelpers()->GradientFill(pDC, rc, clr1, clr2, TRUE);
		}
		else
		{
			float fHeight = (float)rcFrame.Height();

			COLORREF clr1 = XTPDrawHelpers()->BlendColors(clrLight, clrDark, float(rc.top - rcFrame.top) / fHeight);
			COLORREF clr2 = XTPDrawHelpers()->BlendColors(clrLight, clrDark, float(rc.bottom - rcFrame.top) / fHeight);

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

void AFX_CDECL CXTPDockingPaneCaptionButton::DrawPinnButton(CDC* pDC, CPoint pt, BOOL bPinned)
{
	pt.y--;

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

void AFX_CDECL CXTPDockingPaneCaptionButton::DrawMaximizeRestoreButton(CDC* pDC, CPoint pt, BOOL bMaximize, COLORREF clr)
{
	if (bMaximize)
	{
		pDC->Draw3dRect(pt.x - 5, pt.y - 5, 9, 9, clr, clr);
		pDC->FillSolidRect(pt.x - 5, pt.y - 5, 9, 2, clr);
	}
	else
	{
		pDC->Draw3dRect(pt.x - 4, pt.y - 2, 6, 6, clr, clr);
		pDC->FillSolidRect(pt.x - 4, pt.y - 2, 6, 2, clr);

		pDC->FillSolidRect(pt.x - 2, pt.y - 5, 6, 2, clr);
		pDC->SetPixel(pt.x - 2, pt.y - 3, clr);
		pDC->FillSolidRect(pt.x + 3, pt.y - 3, 1, 4, clr);
		pDC->SetPixel(pt.x + 2, pt.y, clr);
	}
}

void CXTPDockingPaneCaptionButton::InvalidateRect()
{
	m_pPane->RedrawPane();
}

BOOL CXTPDockingPaneCaptionButton::IsEnabled() const
{
	CXTPDockingPane* pPane = CXTPDockingPanePaintManager::GetSelectedPane(GetPane());
	if (pPane && ((pPane->GetEnabled() & xtpPaneEnableActions) == 0))
		return FALSE;

	return TRUE;
}

DWORD CXTPDockingPaneCaptionButton::Click (CWnd* pWnd, CPoint pt, BOOL bClient)
{
	if ((::GetCapture() != NULL))
		return FALSE;

	pWnd->SetCapture();
	ASSERT(pWnd == CWnd::GetCapture());

	BOOL  bClick = FALSE;
	CRect rcBtn(m_rcButton);

	while (CWnd::GetCapture() == pWnd)
	{

		BOOL bNewDown = ::PtInRect (rcBtn, pt) != 0;
		if (bNewDown != m_bPressed)
		{
			m_bPressed = bNewDown;

			InvalidateRect();
		}

		MSG msg;
		VERIFY(::GetMessage(&msg, NULL, 0, 0));

		switch (msg.message)
		{
		case WM_NCMOUSEMOVE:
			break;
		case WM_MOUSEMOVE:
			pt = CPoint((short signed)LOWORD(msg.lParam), (short signed)HIWORD(msg.lParam));
			if (!bClient)
			{
				pWnd->ClientToScreen (&pt);
				CXTPDrawHelpers::ScreenToWindow(pWnd, &pt);
			}
			break;

		case WM_LBUTTONUP:
			bClick = m_bPressed;
			goto ExitLoop;

		case WM_KEYDOWN:
			if (msg.wParam != VK_ESCAPE)
				break;
		case WM_CANCELMODE:
		case WM_RBUTTONDOWN:
			goto ExitLoop;

		default:
			DispatchMessage (&msg);
			break;
		}
	}
ExitLoop:
	ReleaseCapture();

	m_bPressed = FALSE;
	CheckForMouseOver (pt);

	InvalidateRect();

	return bClick;
}

void CXTPDockingPaneCaptionButton::SetRect (CRect rc)
{
	ASSERT(m_pPane);
	if (!m_pPane)
		return;

	if (rc != m_rcButton)
	{
		m_rcButton = rc;
		m_pPane->OnCaptionButtonRectChanged(this);
	}
}

BOOL CXTPDockingPaneCaptionButton::CheckForMouseOver (CPoint pt)
{
	if (!PtInRect (pt) && m_bSelected)
	{
		m_bSelected = FALSE;
		InvalidateRect();
	}

	if (!m_bSelected && PtInRect (pt) && IsEnabled())
	{
		TRACKMOUSEEVENT tme =
		{
			sizeof(TRACKMOUSEEVENT), TME_LEAVE, m_pPane->GetPaneHwnd()
		};
		_TrackMouseEvent(&tme);

		m_bSelected = TRUE;

		InvalidateRect();
		return TRUE;
	}
	return FALSE;
}

///////////////////////////////////////////////////////////////////////////////
// CXTPDockingPanePaintManager


CXTPDockingPanePaintManager::CXTPDockingPanePaintManager()
: m_bUseOfficeFont(FALSE)
, m_strOfficeFont(_T("Tahoma"))
{

	m_themeToolbar = new CXTPWinThemeWrapper();
	m_themeExplorer = new CXTPWinThemeWrapper();
	m_themeButton = new CXTPWinThemeWrapper();
	m_themeWindow = new CXTPWinThemeWrapper();
	m_themeRebar = new CXTPWinThemeWrapper();

	m_pTabPaintManager = new CXTPTabPaintManager();
	m_pTabPaintManager->SetLayout(xtpTabLayoutSizeToFit);
	m_pTabPaintManager->SetPosition(xtpTabPositionBottom);
	m_pTabPaintManager->m_clientFrame = xtpTabFrameSingleLine;
	m_pTabPaintManager->m_bBoldSelected = FALSE;
	m_pTabPaintManager->EnableToolTips();

	m_pPanelPaintManager = new CXTPTabPaintManager();
	m_pPanelPaintManager->SetLayout(xtpTabLayoutCompressed);
	m_pPanelPaintManager->m_clientFrame = xtpTabFrameNone;
	m_pPanelPaintManager->m_bBoldSelected = FALSE;
	m_pPanelPaintManager->m_bInvertGradient = TRUE;
	m_pPanelPaintManager->m_bFillBackground = FALSE;

	m_bAutoHidePanelHighlightSelected = TRUE;

	m_bDrawSingleTab = FALSE;
	m_nSplitterSize = 4;
	m_nSplitterIndent = 0;
	m_bDrawCaptionIcon = FALSE;

	m_rcCaptionMargin.SetRect(0, 2, 0, 1);
	m_nCaptionFontGap = 5;

	m_bShowCaption = TRUE;
	m_bUseStandardFont = TRUE;

	m_bHighlightActiveCaption = TRUE;
	m_systemTheme = xtpSystemThemeDefault;
	m_bUseBoldCaptionFont = TRUE;
	m_dwSplitterStyle = xtpPaneSplitterFlat;

	m_nCaptionButtonStyle = xtpPaneCaptionButtonDefault;
	m_nTitleHeight = 0;
	m_nTabsHeight = 0;
	m_bLunaTheme = FALSE;

}

DWORD CXTPDockingPanePaintManager::GetSplitterStyle() const
{
	return m_dwSplitterStyle;
}

void CXTPDockingPanePaintManager::SetSplitterStyle(DWORD dwStyle)
{
	m_dwSplitterStyle = dwStyle;

	m_nSplitterSize = dwStyle == xtpPaneSplitterFlat ? 4 : 7;

}

XTPCurrentSystemTheme CXTPDockingPanePaintManager::GetCurrentSystemTheme() const
{
	if (m_systemTheme == xtpSystemThemeDefault)
		return XTPColorManager()->IsLunaColorsDisabled() ? xtpSystemThemeUnknown :
			XTPColorManager()->GetCurrentSystemTheme();

	if (m_systemTheme == xtpSystemThemeAuto)
		return XTPColorManager()->GetWinThemeWrapperTheme();

	return m_systemTheme;
}

void CXTPDockingPanePaintManager::SetLunaTheme(XTPCurrentSystemTheme systemTheme)
{
	m_systemTheme = systemTheme;
	RefreshMetrics();

}

COLORREF CXTPDockingPanePaintManager::GetXtremeColor(UINT nIndex)
{
	if (nIndex > XPCOLOR_LAST) return nIndex;
	return m_arrColor[nIndex];
}

void CXTPDockingPanePaintManager::SetColors(int cElements, CONST INT* lpaElements, CONST COLORREF* lpaRgbValues)
{
	for (int i = 0; i < cElements; i++)
		m_arrColor[lpaElements[i]] = lpaRgbValues[i];
}



CXTPDockingPanePaintManager::~CXTPDockingPanePaintManager()
{
	m_pTabPaintManager->InternalRelease();
	m_pPanelPaintManager->InternalRelease();

	SAFE_DELETE(m_themeToolbar);
	SAFE_DELETE(m_themeExplorer);
	SAFE_DELETE(m_themeButton);
	SAFE_DELETE(m_themeWindow);
	SAFE_DELETE(m_themeRebar);
}

CXTPTabPaintManager* CXTPDockingPanePaintManager::SetTabPaintManager(CXTPTabPaintManager* pManager)
{
	m_pTabPaintManager->InternalRelease();
	m_pTabPaintManager = pManager;

	m_pTabPaintManager->SetLayout(xtpTabLayoutSizeToFit);
	m_pTabPaintManager->SetPosition(xtpTabPositionBottom);
	m_pTabPaintManager->m_bBoldSelected = FALSE;
	m_pTabPaintManager->EnableToolTips();

	pManager->RefreshMetrics();
	return pManager;
}

CXTPTabPaintManager* CXTPDockingPanePaintManager::SetPanelPaintManager(CXTPTabPaintManager* pManager)
{
	delete m_pPanelPaintManager;
	m_pPanelPaintManager = pManager;

	m_pPanelPaintManager->SetLayout(xtpTabLayoutCompressed);
	m_pPanelPaintManager->m_clientFrame = xtpTabFrameNone;
	m_pPanelPaintManager->m_bBoldSelected = FALSE;
	m_pPanelPaintManager->m_bInvertGradient = TRUE;
	m_pPanelPaintManager->m_bFillBackground = FALSE;


	pManager->RefreshMetrics();
	return pManager;
}


void CXTPDockingPanePaintManager::UseOfficeFont(BOOL bUseOfficeFont)
{
	m_bUseOfficeFont = bUseOfficeFont;
	RefreshMetrics();
}

void CXTPDockingPanePaintManager::SetCaptionFontIndirect(LOGFONT* pLogFont, BOOL bUseStandardFont /*= FALSE*/)
{
	m_bUseStandardFont = bUseStandardFont;

	if (!pLogFont)
		return;

	BOOL bUseSystemFont = (pLogFont->lfCharSet > SYMBOL_CHARSET);
	if (m_bUseOfficeFont && !bUseSystemFont && bUseStandardFont && XTPDrawHelpers()->FontExists(_T("Tahoma")))
	{
		STRCPY_S(pLogFont->lfFaceName, LF_FACESIZE, _T("Tahoma"));
	}

	m_fntTitle.DeleteObject();
	VERIFY(m_fntTitle.CreateFontIndirect(pLogFont));

	pLogFont->lfOrientation = 900;
	pLogFont->lfEscapement = 2700;
	pLogFont->lfHeight = pLogFont->lfHeight < 0 ? __min(-11, pLogFont->lfHeight) : pLogFont->lfHeight;
	STRCPY_S(pLogFont->lfFaceName, LF_FACESIZE, CXTPDrawHelpers::GetVerticalFontName(m_bUseOfficeFont));

	m_fntTitleVertical.DeleteObject();
	m_fntTitleVertical.CreateFontIndirect(pLogFont);


	CWindowDC dc(CWnd::GetDesktopWindow());
	CXTPFontDC font(&dc, &m_fntTitle);
	m_nTitleHeight = max(13, dc.GetTextExtent(_T(" "), 1).cy) + m_nCaptionFontGap;
}

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

	CXTPColorManager* pColorManager = XTPColorManager();

	for (int i = 0; i <= XPCOLOR_LAST; i++)
		m_arrColor[i] = pColorManager->GetColor(i);

	m_clrSplitterGripper.SetStandardValue(m_arrColor[COLOR_3DSHADOW]);
	m_clrSplitter.SetStandardValue(m_arrColor[COLOR_3DFACE]);
	m_clrSplitterGradient.SetStandardValue(GetSysColor(COLOR_3DFACE), XTPColorManager()->LightColor(GetSysColor(COLOR_3DFACE), GetSysColor(COLOR_WINDOW), 0xcd));
	m_clrDisabledCaptionText.SetStandardValue(m_arrColor[COLOR_GRAYTEXT]);

	if (m_bUseStandardFont)
	{
		NONCLIENTMETRICS ncm =
		{
			sizeof(NONCLIENTMETRICS)
		};
		VERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));
		if (!m_bUseBoldCaptionFont)
			ncm.lfSmCaptionFont.lfWeight = FW_NORMAL;
		ncm.lfSmCaptionFont.lfCharSet = XTPResourceManager()->GetFontCharset();

		SetCaptionFontIndirect(&ncm.lfSmCaptionFont, TRUE);
	}

	m_pTabPaintManager->RefreshMetrics();
	m_pPanelPaintManager->RefreshMetrics();

	CWindowDC dc(CWnd::GetDesktopWindow());
	CXTPFontDC font(&dc, m_pTabPaintManager->GetFont(FALSE));
	m_nTabsHeight = max(24, dc.GetTextExtent(_T(" "), 1).cy + 10);

	m_themeExplorer->OpenTheme(0, L"EXPLORERBAR");
	m_themeButton->OpenTheme(0, L"BUTTON");
	m_themeToolbar->OpenThemeData(0, L"TOOLBAR");
	m_themeWindow->OpenThemeData(0, L"WINDOW");
	m_themeRebar->OpenThemeData(0, L"REBAR");

	m_bLunaTheme = FALSE;
}

void CXTPDockingPanePaintManager::Line(CDC* pDC, int x0, int y0, int x1, int y1, int nPen)
{
	CXTPPenDC pen(*pDC, GetXtremeColor(nPen));
	pDC->MoveTo(x0, y0);
	pDC->LineTo(x1, y1);
}

void CXTPDockingPanePaintManager::Line(CDC* pDC, int x0, int y0, int x1, int y1)
{
	pDC->MoveTo(x0, y0);
	pDC->LineTo(x1, y1);
}


void CXTPDockingPanePaintManager::Rectangle(CDC* pDC, CRect rc, int nBrush, int nPen)
{
	pDC->FillSolidRect(rc, GetXtremeColor(nBrush));
	pDC->Draw3dRect(rc, GetXtremeColor(nPen), GetXtremeColor(nPen));
}

void CXTPDockingPanePaintManager::Pixel(CDC* pDC, int x, int y, int nPen)
{
	pDC->SetPixel(x, y, GetXtremeColor(nPen));
}

CRect CXTPDockingPanePaintManager::GetCaptionGripperRect(const CXTPDockingPaneTabbedContainer* /*pPane*/)
{
	return CRect(0, 0, 0, 0);
}


void CXTPDockingPanePaintManager::DrawCaptionButtons(CDC* pDC, CXTPDockingPaneCaptionButtons* pButtons, CRect& rcCaption, COLORREF clr, int nButtonSize, int nButtonGap, BOOL bVertical)
{
	if (!pButtons)
		return;

	CRect rcButton(
		bVertical ? CPoint((rcCaption.left + rcCaption.right - nButtonSize) / 2, rcCaption.bottom - nButtonSize) :
			CPoint(rcCaption.right - nButtonSize , (rcCaption.top + rcCaption.bottom - nButtonSize) / 2),
		CSize(nButtonSize, nButtonSize));

	for (int i = 0; i < pButtons->GetSize(); i++)
	{
		CXTPDockingPaneCaptionButton* pButton = pButtons->GetAt(i);

		if (i == 0)
		{
			CXTPDockingPane* pPane = GetSelectedPane(pButton->GetPane());

			if (pPane && ((pPane->GetEnabled() & xtpPaneEnableActions) == 0))
				clr = m_clrDisabledCaptionText;
		}

		if (pButton->IsVisible())
		{


			pButton->SetRect(rcButton);
			DrawCaptionButton(pDC, pButton, clr);

			if (bVertical)
			{
				rcButton.OffsetRect(0, - nButtonSize - nButtonGap);
			}
			else
			{
				rcButton.OffsetRect(- nButtonSize - nButtonGap, 0);
			}
		}
		else
		{
			pButton->SetRect(CXTPEmptyRect());
		}
	}
	if (bVertical)
	{
		rcCaption.bottom = rcButton.bottom;
	}
	else
	{
		rcCaption.right = rcButton.right;
	}
}

void CXTPDockingPanePaintManager::DrawCaptionButton(CDC* pDC, CXTPDockingPaneCaptionButton* pButton, COLORREF clrButton)
{
	CRect rc = pButton->GetRect();
	CPoint pt = rc.CenterPoint();

	XTPDockingPaneCaptionButtonStyle nCaptionButtonStyle = m_nCaptionButtonStyle;

	if (nCaptionButtonStyle == xtpPaneCaptionButtonThemedToolBar)
	{
		if (!m_themeToolbar->IsAppThemed())
		{
			nCaptionButtonStyle = xtpPaneCaptionButtonOffice;
		}
		else
		{
			if (pButton->IsPressed())
			{
				m_themeToolbar->DrawThemeBackground(pDC->GetSafeHdc(), TP_BUTTON, TS_PRESSED, &rc, 0);
			}
			else if (pButton->IsSelected())
			{
				m_themeToolbar->DrawThemeBackground(pDC->GetSafeHdc(), TP_BUTTON, TS_HOT, &rc, 0);
			}
		}
	}

	if (nCaptionButtonStyle == xtpPaneCaptionButtonThemedToolWindow)
	{
		if (!m_themeWindow->IsAppThemed() || pButton->GetID() != XTP_IDS_DOCKINGPANE_CLOSE )
		{
			nCaptionButtonStyle = xtpPaneCaptionButtonOffice;
		}
		else
		{
			BOOL bActive = TRUE;
			if (pButton->GetPane()->GetType() == xtpPaneTypeTabbedContainer)
				bActive = ((CXTPDockingPaneTabbedContainer*)pButton->GetPane())->IsActive();
			if (pButton->GetPane()->GetType() == xtpPaneTypeMiniWnd)
				bActive = ((CXTPDockingPaneMiniWnd*)pButton->GetPane())->IsActive();

			int nState = pButton->IsPressed() ? CBS_PUSHED: pButton->IsSelected() ? CBS_HOT : !bActive ? 5 : CBS_NORMAL;
			m_themeWindow->DrawThemeBackground(pDC->GetSafeHdc(), WP_SMALLCLOSEBUTTON, nState, &rc, 0);
			return;
		}
	}

	if (nCaptionButtonStyle == xtpPaneCaptionButtonThemedExplorerBar)
	{
		if (!m_themeExplorer->IsAppThemed())
		{
			nCaptionButtonStyle = xtpPaneCaptionButtonOffice;
		}
		else
		{
			if (pButton->GetID() == XTP_IDS_DOCKINGPANE_CLOSE || pButton->GetID() == XTP_IDS_DOCKINGPANE_AUTOHIDE)
			{

				BOOL bActive = TRUE;
				if (pButton->GetPane()->GetType() == xtpPaneTypeTabbedContainer)
					bActive = ((CXTPDockingPaneTabbedContainer*)pButton->GetPane())->IsActive();
				if (pButton->GetPane()->GetType() == xtpPaneTypeMiniWnd)
					bActive = ((CXTPDockingPaneMiniWnd*)pButton->GetPane())->IsActive();

				bActive = m_bHighlightActiveCaption && bActive;

				if (pButton->GetID() == XTP_IDS_DOCKINGPANE_CLOSE)
				{
					int nState = pButton->IsPressed() ? EBHC_PRESSED: bActive || pButton->IsSelected() ? EBHC_HOT : EBHC_NORMAL;
					if (SUCCEEDED(m_themeExplorer->DrawThemeBackground(*pDC, EBP_HEADERCLOSE, nState, pButton->GetRect(), 0)))
						return;
				}
				else
				{
					int nState = pButton->IsPressed() ? EBHP_PRESSED: pButton->IsSelected() ? EBHP_HOT : EBHP_NORMAL;
					if (SUCCEEDED(m_themeExplorer->DrawThemeBackground(*pDC, EBP_HEADERPIN, (pButton->GetState() & xtpPanePinPushed ? 0 : 3) + nState, pButton->GetRect(), 0)))
						return;
				}
			}

			nCaptionButtonStyle = xtpPaneCaptionButtonThemedButton;
		}
	}

	if (nCaptionButtonStyle == xtpPaneCaptionButtonThemedButton)
	{
		if (!m_themeButton->IsAppThemed())
		{
			nCaptionButtonStyle = xtpPaneCaptionButtonOffice;
		}
		else
		{
			int nState = pButton->IsPressed() ? PBS_PRESSED: pButton->IsSelected() ? PBS_HOT: PBS_NORMAL;
			if (nState != PBS_NORMAL)
			{
				m_themeButton->DrawThemeBackground(*pDC, BP_PUSHBUTTON, nState, pButton->GetRect(), 0);
				m_themeButton->GetThemeColor(BP_PUSHBUTTON, nState, TMT_TEXTCOLOR, &clrButton);
			}
		}
	}

	if (nCaptionButtonStyle == xtpPaneCaptionButtonDefault)
	{
		pDC->DrawFrameControl(&rc, DFC_BUTTON, DFCS_ADJUSTRECT | DFCS_BUTTONPUSH | (pButton->IsPressed() ? DFCS_PUSHED : 0));

		if (pButton->IsPressed()) pt.Offset(1, 1);
	}

	if (nCaptionButtonStyle == xtpPaneCaptionButtonOffice)
	{
		if (pButton->IsPressed())
		{
			pDC->Draw3dRect(rc, GetXtremeColor(COLOR_BTNTEXT), GetXtremeColor(COLOR_BTNHILIGHT));
			pt.Offset(1, 1);
		}
		else if (pButton->IsSelected())
			pDC->Draw3dRect(rc, GetXtremeColor(COLOR_BTNHILIGHT), GetXtremeColor(COLOR_BTNTEXT));
	}

	if (nCaptionButtonStyle == xtpPaneCaptionButtonOffice2003)
	{
		if (pButton->IsSelected())
		{
			if (!m_bLunaTheme)
			{
				Rectangle(pDC, rc, XPCOLOR_HIGHLIGHT, XPCOLOR_HIGHLIGHT_BORDER);
				clrButton = GetXtremeColor(XPCOLOR_HIGHLIGHT_TEXT);
			}
			else
			{
				XTPDrawHelpers()->GradientFill(pDC, rc, RGB(255, 242, 200), RGB(255, 212, 151), FALSE);
				pDC->Draw3dRect(rc, GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER), GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER));
				clrButton = 0;
			}
		}
		if (pButton->IsPressed())
		{
			if (!m_bLunaTheme)
			{
				Rectangle(pDC, rc, XPCOLOR_HIGHLIGHT_PUSHED, XPCOLOR_HIGHLIGHT_BORDER);
				clrButton = GetXtremeColor(XPCOLOR_PUSHED_TEXT);
			}
			else
			{
				XTPDrawHelpers()->GradientFill(pDC, rc, RGB(254, 142, 75), RGB(255, 207, 139), FALSE);
				pDC->Draw3dRect(rc, GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER), GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER));
				clrButton = 0;
			}
		}
	}

	DrawCaptionButtonEntry(pDC, pButton, pt, clrButton);
}



void CXTPDockingPanePaintManager::DrawPane(CDC* pDC, CXTPDockingPaneTabbedContainer* pPane, CRect rc)
{
	pDC->FillSolidRect(rc, GetXtremeColor(COLOR_3DFACE));
	pDC->SetBkMode(TRANSPARENT);

	CRect rcCaption(rc);

	if (pPane->IsTabsVisible())
	{
		AdjustCaptionRect(pPane, rc);
		m_pTabPaintManager->DrawTabControl(pPane, pDC, rc);
	}

	if (pPane->IsTitleVisible())
	{
		DrawCaption(pDC, pPane, rcCaption);
	}

}

void CXTPDockingPanePaintManager::GetCaptionRect(const CXTPDockingPaneTabbedContainer* pPane, CRect& rc)
{
	if (pPane->IsTitleVisible())
	{
		GetClientRect(pPane->GetSafeHwnd(), rc);

		if (pPane->IsCaptionVertical())
		{
			rc.right = rc.left + m_nTitleHeight + m_rcCaptionMargin.top + m_rcCaptionMargin.bottom;
		}
		else
		{
			rc.bottom = rc.top + m_nTitleHeight + m_rcCaptionMargin.top + m_rcCaptionMargin.bottom;
		}
	}
	else
	{
		rc.SetRectEmpty();
	}
}

void CXTPDockingPanePaintManager::AdjustCaptionRect(const CXTPDockingPaneTabbedContainer* pPane, CRect& rc)
{
	if (pPane->IsTitleVisible())
	{
		if (pPane->IsCaptionVertical())
		{
			rc.left += m_nTitleHeight + m_rcCaptionMargin.top + m_rcCaptionMargin.bottom;
		}
		else
		{
			rc.top += m_nTitleHeight + m_rcCaptionMargin.top + m_rcCaptionMargin.bottom;
		}
	}
}

void CXTPDockingPanePaintManager::AdjustClientRect(CXTPDockingPaneTabbedContainer* pPane, CRect& rect, BOOL bApply)
{
	CPoint pt = rect.TopLeft();
	AdjustCaptionRect(pPane, rect);


	if (pPane->IsTabsVisible())
	{
		if (bApply)
		{
			CClientDC dc(pPane);

			CRect rcTabs(rect);
			rcTabs.OffsetRect(-pt);

			m_pTabPaintManager->RepositionTabControl(pPane, &dc, rcTabs);
		}
		m_pTabPaintManager->AdjustClientRect(pPane, rect);
	}
}

void CXTPDockingPanePaintManager::AdjustClientRect(CXTPDockingPaneSidePanel* pPane, CRect& rect)
{
	rect.DeflateRect(3, 3);
	AdjustCaptionRect(pPane, rect);
}

void CXTPDockingPanePaintManager::AdjustCaptionRect(const CXTPDockingPaneSidePanel* pPane, CRect& rect)
{
	int nTitleFont = GetCaptionHeight();
	XTPDockingPaneDirection direction = pPane->GetDirection();

	if (direction == xtpPaneDockLeft) rect.left += nTitleFont;
	else if (direction == xtpPaneDockRight) rect.right -= nTitleFont;
	else if (direction == xtpPaneDockTop) rect.top += nTitleFont;
	else if (direction == xtpPaneDockBottom) rect.bottom -= nTitleFont;
}

CRect CXTPDockingPanePaintManager::GetPaneCaptionRect(const CXTPDockingPaneSidePanel* pPane)
{
	CXTPClientRect rect(pPane);
	rect.DeflateRect(1, 1);

	int nTitleFont = GetCaptionHeight();
	XTPDockingPaneDirection direction = pPane->GetDirection();

	if (direction == xtpPaneDockLeft) rect.right = rect.left + nTitleFont;
	else if (direction == xtpPaneDockRight) rect.left = rect.right - nTitleFont;
	else if (direction == xtpPaneDockTop) rect.bottom = rect.top + nTitleFont;
	else if (direction == xtpPaneDockBottom) rect.top = rect.bottom - nTitleFont;

	return rect;
}


void CXTPDockingPanePaintManager::DrawSplitter(CDC* pDC, CXTPDockingPaneSplitterWnd* pSplitter)
{
	CXTPClientRect rc((CWnd*)pSplitter);

	if (m_dwSplitterStyle & xtpPaneSplitter3D)
	{
		pDC->FillSolidRect(rc, m_clrSplitter);

		if (pSplitter->IsHorizontal())
		{
			pDC->FillSolidRect(0, 0, rc.Width(), 1, GetXtremeColor(COLOR_3DHIGHLIGHT));
			pDC->FillSolidRect(0, rc.bottom - 2, rc.Width(), 1, GetXtremeColor(XPCOLOR_3DSHADOW));
			pDC->FillSolidRect(0, rc.bottom - 1, rc.Width(), 1, GetXtremeColor(COLOR_BTNTEXT));
		}
		else
		{
			pDC->FillSolidRect(0, 0, 1, rc.Height(), GetXtremeColor(COLOR_3DHIGHLIGHT));
			pDC->FillSolidRect(rc.right - 2, 0, 1, rc.Height(), GetXtremeColor(XPCOLOR_3DSHADOW));
			pDC->FillSolidRect(rc.right - 1, 0, 1, rc.Height(), GetXtremeColor(COLOR_BTNTEXT));
		}
	}
	else if (m_dwSplitterStyle & xtpPaneSplitterSoft3D)
	{
		int nCenter = m_nSplitterSize / 2;

		if (pSplitter->IsHorizontal())
		{
			pDC->FillSolidRect(0, 0, rc.Width(), 1, GetXtremeColor(COLOR_3DDKSHADOW));
			pDC->FillSolidRect(0, rc.bottom - 1, rc.Width(), 1, GetXtremeColor(COLOR_3DDKSHADOW));

			pDC->FillSolidRect(0, 1, rc.Width(), nCenter - 1, GetXtremeColor(COLOR_WINDOW));
			pDC->FillSolidRect(0, nCenter, rc.Width(), rc.Height() - nCenter - 1, m_clrSplitter);
		}
		else
		{
			pDC->FillSolidRect(0, 0, 1, rc.Height(), GetXtremeColor(COLOR_3DDKSHADOW));
			pDC->FillSolidRect(rc.right - 1, 0, 1, rc.Height(), GetXtremeColor(COLOR_3DDKSHADOW));

			pDC->FillSolidRect(1, 0, nCenter - 1, rc.Height(), GetXtremeColor(COLOR_WINDOW));
			pDC->FillSolidRect(nCenter, 0, rc.Width() - nCenter - 1, rc.Height(), m_clrSplitter);
		}
	}
	else if (m_dwSplitterStyle & xtpPaneSplitterGradient)
	{
		XTPFillFramePartRect(pDC, rc, (CWnd*)pSplitter, pSplitter->GetParent(), m_clrSplitterGradient, TRUE);
	}
	else if (m_dwSplitterStyle & xtpPaneSplitterGradientVert)
	{
		XTPFillFramePartRect(pDC, rc, (CWnd*)pSplitter, pSplitter->GetParent(), m_clrSplitterGradient, FALSE);
	}
	else
	{
		pDC->FillSolidRect(rc, m_clrSplitter);
	}

	if (m_dwSplitterStyle & xtpPaneSplitterGripperOfficeXP)
	{
		if (pSplitter->IsHorizontal())
		{
			pDC->FillSolidRect(rc.CenterPoint().x, 0 + 2, 11, 1, m_clrSplitterGripper);
			pDC->FillSolidRect(rc.CenterPoint().x, 0 + 4, 11, 1, m_clrSplitterGripper);
		}
		else
		{
			pDC->FillSolidRect(2, rc.CenterPoint().y, 1, 11, m_clrSplitterGripper);
			pDC->FillSolidRect(4, rc.CenterPoint().y, 1, 11, m_clrSplitterGripper);
		}
	}
	if (m_dwSplitterStyle & xtpPaneSplitterGripperOffice2003)
	{
		if (pSplitter->IsHorizontal())
		{
			int nLeft = rc.CenterPoint().x - min(32, rc.Width() /2 - 10);
			int nRight = rc.CenterPoint().x + min(32, rc.Width() /2 - 10);
			int y = rc.CenterPoint().y - 1;

			for (int x = nLeft; x < nRight; x += 4)
			{
				pDC->FillSolidRect(CRect(x + 1, y + 1, x + 3, y + 3), GetXtremeColor(COLOR_BTNHIGHLIGHT));
				pDC->FillSolidRect(CRect(x, y, x + 2, y + 2), m_clrSplitterGripper);
			}
		}
		else
		{
			int nTop = rc.CenterPoint().y - min(32, rc.Height() /2 - 10);
			int nBottom = rc.CenterPoint().y + min(32, rc.Height() /2 - 10);
			int x = rc.CenterPoint().x - 1;

			for (int y = nTop; y < nBottom; y += 4)
			{
				pDC->FillSolidRect(CRect(x + 1, y + 1, x + 3, y + 3), GetXtremeColor(COLOR_BTNHIGHLIGHT));
				pDC->FillSolidRect(CRect(x, y, x + 2, y + 2), m_clrSplitterGripper);
			}
		}

	}
}

//////////////////////////////////////////////////////////////////////////
// CXTPDockingPaneVisualStudio6Theme

CXTPDockingPaneVisualStudio6Theme::CXTPDockingPaneVisualStudio6Theme()
{
	m_nCaptionButtonStyle = xtpPaneCaptionButtonDefault;
}

void CXTPDockingPaneVisualStudio6Theme::DrawCaptionPart(CDC* pDC, CXTPDockingPaneBase* pPane, CRect rcCaption, const CString& strTitle, BOOL bActive, BOOL bVertical)
{
	UNREFERENCED_PARAMETER(strTitle);
	UNREFERENCED_PARAMETER(bActive);

	XTPDeflateRectDirection(rcCaption, 0, 0, 2, 0, bVertical);
	DrawCaptionButtons(pDC, pPane->GetCaptionButtons(), rcCaption, m_clrNormalCaptionText, 14, 2, bVertical);

	int nOffset = 4;
	XTPDeflateRectDirection(rcCaption, 4, 1, 2, 0, bVertical);

	if (bVertical)
	{
		if (rcCaption.bottom > nOffset)
		{
			int nCenter = rcCaption.CenterPoint().x;
			pDC->Draw3dRect(nCenter - 3, nOffset, 3, rcCaption.bottom - nOffset, GetXtremeColor(COLOR_BTNHILIGHT), GetXtremeColor(COLOR_3DSHADOW));
			pDC->Draw3dRect(nCenter + 1, nOffset, 3, rcCaption.bottom - nOffset, GetXtremeColor(COLOR_BTNHILIGHT), GetXtremeColor(COLOR_3DSHADOW));
		}
	}
	else
	{
		if (rcCaption.right > nOffset)
		{
			int nCenter = rcCaption.CenterPoint().y;
			pDC->Draw3dRect(nOffset, nCenter - 3, rcCaption.right - nOffset, 3, GetXtremeColor(COLOR_BTNHILIGHT), GetXtremeColor(COLOR_3DSHADOW));
			pDC->Draw3dRect(nOffset, nCenter + 1, rcCaption.right - nOffset, 3, GetXtremeColor(COLOR_BTNHILIGHT), GetXtremeColor(COLOR_3DSHADOW));
		}
	}
}

///////////////////////////////////////////////////////////////////////////////
// CXTPDockingPaneVisualStudio2003Theme

class CXTPDockingPaneVisualStudio2003Theme::COfficePanelColorSet :
	public CXTPTabPaintManager::CColorSetVisualStudio2003
{
public:
	virtual void RefreshMetrics();
};

void CXTPDockingPaneVisualStudio2003Theme::COfficePanelColorSet::RefreshMetrics()
{
	CColorSetVisualStudio2003::RefreshMetrics();

	if (m_pPaintManager->GetAppearance() == xtpTabAppearanceFlat)
	{
		m_clrSelectedText.SetStandardValue(GetSysColor(COLOR_3DDKSHADOW));
		m_clrNormalText.SetStandardValue(GetSysColor(COLOR_3DDKSHADOW));
	}
}


CXTPDockingPaneVisualStudio2003Theme::CXTPDockingPaneVisualStudio2003Theme()
{
	m_pPanelPaintManager->SetAppearance(xtpTabAppearanceFlat);
	m_pPanelPaintManager->SetColorSet(new COfficePanelColorSet);
	m_pTabPaintManager->SetAppearance(xtpTabAppearanceVisualStudio);
	m_bGradientCaption = FALSE;
	m_bUseBoldCaptionFont = FALSE;
	m_nCaptionButtonSize = 14;
}

void CXTPDockingPaneVisualStudio2003Theme::RefreshMetrics()
{
	CXTPDockingPaneGripperedTheme::RefreshMetrics();

	m_clrActiveCaption.SetStandardValue(GetXtremeColor(COLOR_ACTIVECAPTION), GetXtremeColor(27));
	m_clrNormalCaption.SetStandardValue(GetXtremeColor(COLOR_INACTIVECAPTION), GetSysColor(28));

	m_clrNormalCaptionText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
	m_clrActiveCaptionText.SetStandardValue(GetXtremeColor(COLOR_CAPTIONTEXT));

	if (XTPSystemVersion()->IsWin95())
	{
		// Windows 95
		m_clrNormalCaption.SetStandardValue(GetXtremeColor(COLOR_INACTIVECAPTION));
		m_clrActiveCaption.SetStandardValue(GetXtremeColor(COLOR_ACTIVECAPTION));
	}
}

COLORREF CXTPDockingPaneVisualStudio2003Theme::FillCaptionPart(CDC* pDC, CXTPDockingPaneBase* pPane, CRect rcCaption, BOOL bActive, BOOL bVertical)
{
	if (m_bGradientCaption)
	{
		XTPDrawHelpers()->GradientFill(pDC, rcCaption, bActive ? m_clrActiveCaption : m_clrNormalCaption, !bVertical);
	}
	else
	{
		if (bActive)
		{
			pDC->FillSolidRect(rcCaption, m_clrActiveCaption.clrLight);
		}
		else if (pPane->GetType() != xtpPaneTypeSidePanel)
		{
			CXTPPenDC pen(*pDC, GetXtremeColor(XPCOLOR_3DSHADOW));
			pDC->MoveTo(rcCaption.left + 1, rcCaption.top); pDC->LineTo(rcCaption.right - 1 , rcCaption.top);
			pDC->MoveTo(rcCaption.left, rcCaption.top + 1); pDC->LineTo(rcCaption.left, rcCaption.bottom - 1);
			pDC->MoveTo(rcCaption.left + 1, rcCaption.bottom - 1); pDC->LineTo(rcCaption.right - 1 , rcCaption.bottom - 1);
			pDC->MoveTo(rcCaption.right -1 , rcCaption.top + 1); pDC->LineTo(rcCaption.right - 1, rcCaption.bottom - 1);
		}
	}

	return  bActive ? m_clrActiveCaptionText : m_clrNormalCaptionText;
}

void CXTPDockingPaneVisualStudio2003Theme::DrawCaptionPart(CDC* pDC, CXTPDockingPaneBase* pPane, CRect rcCaption, const CString& strTitle, BOOL bActive, BOOL bVertical)
{
	COLORREF clrButton = FillCaptionPart(pDC, pPane, rcCaption, bActive, bVertical);

	COLORREF clrText = bActive ? m_clrActiveCaptionText : m_clrNormalCaptionText;

	XTPDeflateRectDirection(rcCaption, 0, 0, 2, 0, bVertical);
	DrawCaptionButtons(pDC, pPane->GetCaptionButtons(), rcCaption, clrButton, m_nCaptionButtonSize, 2, bVertical);

	// Title text
	pDC->SetTextColor(IsCaptionEnabled(pPane) ? clrText : m_clrDisabledCaptionText);
	XTPDeflateRectDirection(rcCaption, 4, 1, 0, 0, bVertical);

	DrawCaptionIcon(pDC, pPane, rcCaption, bVertical);
	DrawCaptionText(pDC, strTitle, rcCaption, bVertical);
}


///////////////////////////////////////////////////////////////////////////////
// CXTPDockingPaneDefaultTheme

CXTPDockingPaneDefaultTheme::CXTPDockingPaneDefaultTheme()
{
	m_pPanelPaintManager->SetAppearance(xtpTabAppearancePropertyPage);
	m_pTabPaintManager->SetAppearance(xtpTabAppearancePropertyPage);

	m_nCaptionButtonStyle = xtpPaneCaptionButtonDefault;
}


void CXTPDockingPaneDefaultTheme::RefreshMetrics()
{
	CXTPDockingPanePaintManager::RefreshMetrics();

	m_clrActiveCaption.SetStandardValue(GetXtremeColor(COLOR_ACTIVECAPTION));
	m_clrNormalCaption.SetStandardValue(GetXtremeColor(COLOR_INACTIVECAPTION));

	m_clrActiveCaptionText.SetStandardValue(GetXtremeColor(COLOR_CAPTIONTEXT));
	m_clrNormalCaptionText.SetStandardValue(GetXtremeColor(COLOR_INACTIVECAPTIONTEXT));
}

void CXTPDockingPaneDefaultTheme::DrawFloatingFrame(CDC* pDC, CXTPDockingPaneMiniWnd* pPane, CRect rc)
{
	pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DFACE), 0);
	rc.DeflateRect(1, 1);
	pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DHIGHLIGHT), GetXtremeColor(COLOR_3DSHADOW));
	rc.DeflateRect(1, 1);
	pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_3DFACE));

	int nTitleHeight = m_nTitleHeight;
	CRect rcCaption(rc);
	rcCaption.DeflateRect(0, 0, 0, rc.Height() - nTitleHeight - 3);

	CXTPBufferDC dcCache(*pDC, rcCaption);
	dcCache.SetBkMode(TRANSPARENT);

	dcCache.FillSolidRect(rcCaption, GetXtremeColor(COLOR_3DFACE));

	CString strTitle;
	pPane->GetWindowText(strTitle);

	rcCaption.DeflateRect(1, 2, 1, 2);

	BOOL bActive = m_bHighlightActiveCaption && pPane->IsActive();
	DrawCaptionPart(&dcCache, pPane, rcCaption, strTitle, bActive, FALSE);
}

void CXTPDockingPaneDefaultTheme::DrawSidePanel(CDC* pDC, CXTPDockingPaneSidePanel* pPane, CRect rc)
{
	pDC->FillSolidRect(rc, GetXtremeColor(COLOR_3DFACE));
	pDC->SetBkMode(TRANSPARENT);

	pDC->Draw3dRect(rc, GetXtremeColor(COLOR_WINDOWFRAME), GetXtremeColor(COLOR_WINDOWFRAME));

	CRect rcCaption = GetPaneCaptionRect(pPane);

	BOOL bActive = m_bHighlightActiveCaption && pPane->IsActive();

	CString strTitle = pPane->GetTitle();

	DrawCaptionPart(pDC, pPane, rcCaption, strTitle, bActive, pPane->GetDirection() == xtpPaneDockLeft || pPane->GetDirection() == xtpPaneDockRight);
}

void CXTPDockingPaneDefaultTheme::DrawCaptionPart(CDC* pDC, CXTPDockingPaneBase* pPane, CRect rcCaption, const CString& strTitle, BOOL bActive, BOOL bVertical)
{
	pDC->FillSolidRect(rcCaption, bActive ? m_clrActiveCaption : m_clrNormalCaption);

	XTPDeflateRectDirection(rcCaption, 0, 0, 2, 0, bVertical);
	DrawCaptionButtons(pDC, pPane->GetCaptionButtons(), rcCaption, GetXtremeColor(COLOR_BTNTEXT), 14, 0, bVertical);

	pDC->SetTextColor(IsCaptionEnabled(pPane) ? (bActive ? m_clrActiveCaptionText : m_clrNormalCaptionText) : m_clrDisabledCaptionText);
	XTPDeflateRectDirection(rcCaption, 4, 1, 0, 0, bVertical);

	DrawCaptionIcon(pDC, pPane, rcCaption, bVertical);
	DrawCaptionText(pDC, strTitle, rcCaption, bVertical);
}

void CXTPDockingPaneDefaultTheme::DrawCaption(CDC* pDC, CXTPDockingPaneTabbedContainer* pPane, CRect rc)
{
	BOOL bVertical = pPane->IsCaptionVertical();

	CRect rcCaption(rc);
	XTPDeflateRectDirection(rcCaption, 0, 2, 0, XTPGetRectDirectionHeight(rc, bVertical)  - m_nTitleHeight - 1, bVertical);

	BOOL bActive = m_bHighlightActiveCaption && pPane->IsActive();

	if (bVertical)
	{
		pDC->FillSolidRect(rc.left, rc.top, rcCaption.right + 2, rcCaption.Height(), GetXtremeColor(COLOR_3DFACE));
	}
	else
	{
		pDC->FillSolidRect(rc.left, rc.top, rc.Width(), rcCaption.bottom + 2, GetXtremeColor(COLOR_3DFACE));
	}

	DrawCaptionPart(pDC, pPane, rcCaption, pPane->GetTitle(), bActive, bVertical);
}

///////////////////////////////////////////////////////////////////////////////
// CXTPDockingPaneGripperedTheme

void CXTPDockingPanePaintManager::DrawCaptionButtonEntry(CDC* pDC, CXTPDockingPaneCaptionButton* pButton, CPoint pt, COLORREF clrButton)
{
	CXTPPenDC pen(*pDC, clrButton);

	if (pButton->GetID() == XTP_IDS_DOCKINGPANE_CLOSE)
	{
		pDC->MoveTo(pt.x - 4, pt.y - 3 - 1); pDC->LineTo(pt.x + 3 , pt.y + 4 - 1);
		pDC->MoveTo(pt.x - 4, pt.y + 3 - 1); pDC->LineTo(pt.x + 3 , pt.y - 4 - 1);

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

	}
	else if (pButton->GetID() == XTP_IDS_DOCKINGPANE_AUTOHIDE)
	{
		CXTPDockingPaneCaptionButton::DrawPinnButton(pDC, pt, pButton->GetState() & xtpPanePinPushed);
	}
	else if (pButton->GetID() == XTP_IDS_DOCKINGPANE_MAXIMIZE || pButton->GetID() == XTP_IDS_DOCKINGPANE_RESTORE)
	{
		CXTPDockingPaneCaptionButton::DrawMaximizeRestoreButton(pDC, pt, pButton->GetID() == XTP_IDS_DOCKINGPANE_MAXIMIZE, clrButton);
	}
	else if (pButton->GetID() == XTP_IDS_DOCKINGPANE_MENU)
	{
		CXTPBrushDC brush (*pDC, clrButton);
		CPoint pts[] =
		{
			CPoint(pt.x - 4, pt.y - 1), CPoint(pt.x - 1, pt.y + 2) , CPoint(pt.x, pt.y + 2), CPoint(pt.x + 3, pt.y - 1)
		};
		pDC->Polygon(pts, 4);
	}
}

CXTPDockingPaneGripperedTheme::CXTPDockingPaneGripperedTheme()
{
	m_nCaptionButtonStyle = xtpPaneCaptionButtonOffice;
}

void CXTPDockingPaneGripperedTheme::RefreshMetrics()
{
	CXTPDockingPaneDefaultTheme::RefreshMetrics();

	m_clrActiveCaption.SetStandardValue(GetXtremeColor(COLOR_3DFACE));
	m_clrNormalCaption.SetStandardValue(GetXtremeColor(COLOR_3DFACE));

	m_clrActiveCaptionText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
	m_clrNormalCaptionText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
}

void CXTPDockingPaneGripperedTheme::DrawCaptionPart(CDC* pDC, CXTPDockingPaneBase* pPane, CRect rcCaption, const CString& strTitle, BOOL bActive, BOOL bVertical)
{
	COLORREF clrText = bActive ? m_clrActiveCaptionText : m_clrNormalCaptionText;

	XTPDeflateRectDirection(rcCaption, 0, 0, 2, 0, bVertical);
	DrawCaptionButtons(pDC, pPane->GetCaptionButtons(), rcCaption, clrText, 14, 2, bVertical);

	int nOffset = 4;
	XTPDeflateRectDirection(rcCaption, 4, 1, 2, 0, bVertical);

	if (!strTitle.IsEmpty())
	{
		pDC->SetTextColor(IsCaptionEnabled(pPane) ? clrText : m_clrDisabledCaptionText);


		DrawCaptionIcon(pDC, pPane, rcCaption, bVertical);
		int nWidth = DrawCaptionText(pDC, strTitle, rcCaption, bVertical, TRUE);

		nOffset = nWidth + 4 + (bVertical ? rcCaption.top : rcCaption.left);
	}

	if (bVertical)
	{
		if (rcCaption.bottom > nOffset)
		{
			int nCenter = rcCaption.CenterPoint().x;
			pDC->Draw3dRect(nCenter - 3, nOffset, 3, rcCaption.bottom - nOffset, GetXtremeColor(COLOR_BTNHILIGHT), GetXtremeColor(COLOR_3DSHADOW));
			pDC->Draw3dRect(nCenter + 1, nOffset, 3, rcCaption.bottom - nOffset, GetXtremeColor(COLOR_BTNHILIGHT), GetXtremeColor(COLOR_3DSHADOW));
		}
	}
	else
	{
		if (rcCaption.right > nOffset)
		{
			int nCenter = rcCaption.CenterPoint().y;
			pDC->Draw3dRect(nOffset, nCenter - 3, rcCaption.right - nOffset, 3, GetXtremeColor(COLOR_BTNHILIGHT), GetXtremeColor(COLOR_3DSHADOW));
			pDC->Draw3dRect(nOffset, nCenter + 1, rcCaption.right - nOffset, 3, GetXtremeColor(COLOR_BTNHILIGHT), GetXtremeColor(COLOR_3DSHADOW));
		}
	}
}

void CXTPDockingPaneGripperedTheme::DrawFloatingFrame(CDC* pDC, CXTPDockingPaneMiniWnd* pPane, CRect rc)
{
	CXTPDockingPaneDefaultTheme::DrawFloatingFrame(pDC, pPane, rc);
}

void CXTPDockingPaneGripperedTheme::DrawCaption(CDC* pDC, CXTPDockingPaneTabbedContainer* pPane, CRect rc)
{
	BOOL bVertical = pPane->IsCaptionVertical();

	int nTitleHeight = m_nTitleHeight;
	CRect rcCaption(rc);
	XTPDeflateRectDirection(rcCaption, 0, m_rcCaptionMargin.top, 0, XTPGetRectDirectionHeight(rc, bVertical) - nTitleHeight - 1, bVertical);

	BOOL bActive = m_bHighlightActiveCaption && pPane->IsActive();

	if (bVertical)
	{
		pDC->FillSolidRect(rc.left, rc.top, rcCaption.right + 2, rc.Height(), GetXtremeColor(COLOR_3DFACE));
	}
	else
	{
		pDC->FillSolidRect(rc.left, rc.top, rc.Width(), rcCaption.bottom + 2, GetXtremeColor(COLOR_3DFACE));
	}

	DrawCaptionPart(pDC, pPane, rcCaption, pPane->GetTitle(), bActive, bVertical);
}

//////////////////////////////////////////////////////////////////////////
// CXTPDockingPaneWinExplorerTheme

CXTPDockingPaneWinExplorerTheme::CXTPDockingPaneWinExplorerTheme()
{
	m_bUseBoldCaptionFont = FALSE;
	m_rcCaptionMargin.SetRect(0, 0, 0, 0);
	m_nCaptionFontGap = 9;

	m_nCaptionButtonStyle = xtpPaneCaptionButtonThemedToolBar;
}

void CXTPDockingPaneWinExplorerTheme::DrawCaptionPart(CDC* pDC, CXTPDockingPaneBase* pPane, CRect rcCaption, const CString& strTitle, BOOL bActive, BOOL bVertical)
{
	if (m_themeRebar->IsAppThemed())
	{
		CWnd* pWnd = CWnd::FromHandle(pPane->GetPaneHwnd());

		ASSERT(pWnd);
		if (!pWnd)
			return;

		if (pPane->GetType() == xtpPaneTypeMiniWnd)
		{
			CRect rcClient;
			pWnd->GetWindowRect(rcClient);
			rcClient.OffsetRect(-rcClient.TopLeft());

			m_themeRebar->DrawThemeBackground(pDC->GetSafeHdc(), 0, 0, &rcClient, &rcCaption);
		}
		else
		{

			CWnd* pParent = pPane->GetDockingSite();

			CRect rc, rcParent, rcClient, rcClipRect;
			pWnd->GetClientRect(&rcClient);
			rcClipRect = rcClient;

			if (pParent)
			{
				pParent->GetWindowRect(rcParent);
				pWnd->GetWindowRect(rc);

				rcClient.TopLeft() += rcParent.TopLeft() - rc.TopLeft();
				rcClient.BottomRight() += rcParent.BottomRight() - rc.BottomRight();
			}

			m_themeRebar->DrawThemeBackground(pDC->GetSafeHdc(), 0, 0, &rcClient, &rcCaption);
		}
	}

	COLORREF clrText = bActive ? m_clrActiveCaptionText : m_clrNormalCaptionText;

	XTPDeflateRectDirection(rcCaption, 0, 0, 2, 0, bVertical);
	DrawCaptionButtons(pDC, pPane->GetCaptionButtons(), rcCaption, clrText, 16, 2, bVertical);

	pDC->SetTextColor(IsCaptionEnabled(pPane) ? clrText : m_clrDisabledCaptionText);
	XTPDeflateRectDirection(rcCaption, 4, 1, 0, 0, bVertical);

	DrawCaptionIcon(pDC, pPane, rcCaption, bVertical);
	DrawCaptionText(pDC, strTitle, rcCaption, bVertical);
}

void CXTPDockingPaneWinExplorerTheme::RefreshMetrics()
{
	CXTPDockingPaneGripperedTheme::RefreshMetrics();


	if (m_themeRebar->IsAppThemed())
	{
		m_pPanelPaintManager->SetAppearance(xtpTabAppearancePropertyPage);
		m_pPanelPaintManager->SetColor(xtpTabColorWinNative);
		m_pPanelPaintManager->m_bHotTracking = TRUE;

		m_pTabPaintManager->SetAppearance(xtpTabAppearancePropertyPage);
		m_pTabPaintManager->SetColor(xtpTabColorWinNative);
		m_pTabPaintManager->m_bHotTracking = TRUE;
	}
	else
	{
		m_pPanelPaintManager->SetAppearance(xtpTabAppearanceFlat);
		m_pPanelPaintManager->m_bHotTracking = FALSE;

		m_pTabPaintManager->SetAppearance(xtpTabAppearanceVisualStudio);
		m_pTabPaintManager->m_bHotTracking = FALSE;

	}
}

///////////////////////////////////////////////////////////////////////////////
// CXTPDockingPaneOffice2002VisioTheme

CXTPDockingPaneOffice2002VisioTheme::CXTPDockingPaneOffice2002VisioTheme()
{
	m_pPanelPaintManager->SetAppearance(xtpTabAppearanceFlat);

	m_pTabPaintManager->SetAppearance(xtpTabAppearanceVisio);
	m_pTabPaintManager->SetPosition(xtpTabPositionTop);

	m_nCaptionFontGap = 2;
	m_nCaptionButtonStyle = xtpPaneCaptionButtonOffice2003;
}

void CXTPDockingPaneOffice2002VisioTheme::RefreshMetrics()
{
	CXTPDockingPanePaintManager::RefreshMetrics();
}


void CXTPDockingPaneOffice2002VisioTheme::AdjustCaptionRect(const CXTPDockingPaneTabbedContainer* pPane, CRect& rc)
{
	CXTPDockingPaneVisualStudio2003Theme::AdjustCaptionRect(pPane, rc);

	BOOL bVertical = pPane->IsCaptionVertical();

	XTPDeflateRectDirection(rc, 3, 0, 3, 3, bVertical);

	if (!pPane->IsTitleVisible())
	{
		rc.DeflateRect(0, 3, 0, 0);
	}
	if (!pPane->IsTabsVisible() && m_pTabPaintManager->m_clientFrame != xtpTabFrameNone)
	{
		rc.DeflateRect(1, 1);
	}
}

void CXTPDockingPaneOffice2002VisioTheme::DrawPane(CDC* pDC, CXTPDockingPaneTabbedContainer* pPane, CRect rc)
{
	BOOL bActive = m_bHighlightActiveCaption && pPane->IsActive();
	pDC->FillSolidRect(rc, GetXtremeColor(bActive ? XPCOLOR_HIGHLIGHT : XPCOLOR_TOOLBAR_FACE));
	pDC->SetBkMode(TRANSPARENT);

	CRect rcClient(rc);

	if (pPane->IsTitleVisible())
	{
		pDC->FillSolidRect(rc.left, rc.top, rc.Width(), 1, m_clrSplitter);
		DrawCaption(pDC, pPane, rc);
		rcClient.top++;
	}

	AdjustCaptionRect(pPane, rc);

	if (pPane->IsTabsVisible())
	{
		m_pTabPaintManager->DrawTabControl(pPane, pDC, rc);
	}
	else if (m_pTabPaintManager->m_clientFrame != xtpTabFrameNone)
	{
		pDC->Draw3dRect(rc.left - 1, rc.top - 1, rc.Width() + 2, rc.Height() + 2, m_pTabPaintManager->GetColorSet()->m_clrFrameBorder, m_pTabPaintManager->GetColorSet()->m_clrFrameBorder);
	}


	Pixel(pDC, rcClient.left, rcClient.top, XPCOLOR_3DFACE);
	Pixel(pDC, rcClient.right - 1, rcClient.top, XPCOLOR_3DFACE);
	Pixel(pDC, rcClient.left, rcClient.bottom -1, XPCOLOR_3DFACE);
	Pixel(pDC, rcClient.right - 1, rcClient.bottom -1, XPCOLOR_3DFACE);
}

void CXTPDockingPaneOffice2002VisioTheme::DrawFloatingFrame(CDC* pDC, CXTPDockingPaneMiniWnd* pPane, CRect rc)
{
	BOOL bActive = m_bHighlightActiveCaption && pPane->IsActive();
	COLORREF clrFrame = GetXtremeColor(bActive ? XPCOLOR_HIGHLIGHT : XPCOLOR_TOOLBAR_FACE);

	pDC->Draw3dRect(rc, clrFrame, 0);
	rc.DeflateRect(1, 1);
	pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DHIGHLIGHT), GetXtremeColor(COLOR_3DSHADOW));
	rc.DeflateRect(1, 1);
	pDC->Draw3dRect(rc, clrFrame, clrFrame);

	int nTitleHeight = m_nTitleHeight;
	CRect rcCaption(rc);
	rcCaption.DeflateRect(0, 0, 0, rc.Height() - nTitleHeight - 3);

	pDC->FillSolidRect(rcCaption, clrFrame);

	rcCaption.right -= 2;
	DrawCaptionButtons(pDC, pPane->GetCaptionButtons(), rcCaption, GetXtremeColor(COLOR_BTNTEXT), 16, 0, FALSE);

	CString strTitle;
	pPane->GetWindowText(strTitle);


	int nRight = rcCaption.right;


	COLORREF clrText = GetXtremeColor(COLOR_BTNTEXT);
	int nLeft = 4;
	if (!strTitle.IsEmpty())
	{
		pDC->SetBkMode(TRANSPARENT);
		CRect rcText(rcCaption.left + 4, rcCaption.top + 1, nRight - 2, rcCaption.bottom);
		pDC->SetTextColor(clrText);
		CXTPFontDC font(pDC, &m_fntTitle);
		pDC->DrawText(strTitle, rcText, DT_SINGLELINE | DT_END_ELLIPSIS | DT_VCENTER | DT_NOPREFIX);

		CRect rcCalc(0, 0, 0, 0);
		pDC->DrawText(strTitle, rcCalc, DT_CALCRECT | DT_SINGLELINE | DT_NOPREFIX);

		nLeft = rcCalc.Width() + rcCaption.left + 14;
	}
	nRight -= 4;

	if (nRight - nLeft > 0)
	{
		int nCenter = rcCaption.CenterPoint().y;
		Line(pDC, nLeft, nCenter - 3, nRight, nCenter - 3, !bActive ? XPCOLOR_TOOLBAR_GRIPPER : COLOR_BTNTEXT);
		Line(pDC, nLeft, nCenter - 1, nRight, nCenter - 1, !bActive ? XPCOLOR_TOOLBAR_GRIPPER : COLOR_BTNTEXT);
		Line(pDC, nLeft, nCenter + 1, nRight, nCenter + 1, !bActive ? XPCOLOR_TOOLBAR_GRIPPER : COLOR_BTNTEXT);
		Line(pDC, nLeft, nCenter + 3, nRight, nCenter + 3, !bActive ? XPCOLOR_TOOLBAR_GRIPPER : COLOR_BTNTEXT);
	}
}

void CXTPDockingPaneOffice2002VisioTheme::DrawCaption(CDC* pDC, CXTPDockingPaneTabbedContainer* pPane, CRect rc)
{
	BOOL bVertical = pPane->IsCaptionVertical();
	BOOL bActive = m_bHighlightActiveCaption && pPane->IsActive();
	int nTitleHeight = m_nTitleHeight;
	CString strTitle = pPane->GetTitle();

	CRect rcCaption(rc);
	XTPDeflateRectDirection(rcCaption, 0, 2, 1, XTPGetRectDirectionHeight(rc, bVertical) - nTitleHeight - 3, bVertical);


	DrawCaptionButtons(pDC, pPane->GetCaptionButtons(), rcCaption, 0, 16, 0, bVertical);

	COLORREF clrText = GetXtremeColor(COLOR_BTNTEXT);

	int nOffset = 4;
	XTPDeflateRectDirection(rcCaption, 4, 1, 2, 0, bVertical);

	if (!strTitle.IsEmpty())
	{
		pDC->SetTextColor(IsCaptionEnabled(pPane) ? clrText : m_clrDisabledCaptionText);
		int nWidth = DrawCaptionText(pDC, strTitle, rcCaption, bVertical, TRUE);

		nOffset = nWidth + 10 + (bVertical ? rcCaption.top : rcCaption.left);
	}

	if (bVertical)
	{
		if (rcCaption.bottom - nOffset > 0)
		{
			int nCenter = rcCaption.CenterPoint().x;
			Line(pDC, nCenter - 3, nOffset, nCenter - 3, rcCaption.bottom, !bActive ? XPCOLOR_TOOLBAR_GRIPPER : COLOR_BTNTEXT);
			Line(pDC, nCenter - 1, nOffset, nCenter - 1, rcCaption.bottom, !bActive ? XPCOLOR_TOOLBAR_GRIPPER : COLOR_BTNTEXT);
			Line(pDC, nCenter + 1, nOffset, nCenter + 1, rcCaption.bottom, !bActive ? XPCOLOR_TOOLBAR_GRIPPER : COLOR_BTNTEXT);
			Line(pDC, nCenter + 3, nOffset, nCenter + 3, rcCaption.bottom, !bActive ? XPCOLOR_TOOLBAR_GRIPPER : COLOR_BTNTEXT);
		}
	}
	else
	{
		if (rcCaption.right - nOffset > 0)
		{
			int nCenter = rcCaption.CenterPoint().y;
			Line(pDC, nOffset, nCenter - 3, rcCaption.right, nCenter - 3, !bActive ? XPCOLOR_TOOLBAR_GRIPPER : COLOR_BTNTEXT);
			Line(pDC, nOffset, nCenter - 1, rcCaption.right, nCenter - 1, !bActive ? XPCOLOR_TOOLBAR_GRIPPER : COLOR_BTNTEXT);
			Line(pDC, nOffset, nCenter + 1, rcCaption.right, nCenter + 1, !bActive ? XPCOLOR_TOOLBAR_GRIPPER : COLOR_BTNTEXT);
			Line(pDC, nOffset, nCenter + 3, rcCaption.right, nCenter + 3, !bActive ? XPCOLOR_TOOLBAR_GRIPPER : COLOR_BTNTEXT);
		}
	}
}

///////////////////////////////////////////////////////////////////////////////
// CXTPDockingPaneOffice2003VisioTheme

CXTPDockingPaneOffice2003VisioTheme::CXTPDockingPaneOffice2003VisioTheme()
{

}

///////////////////////////////////////////////////////////////////////////////
// CXTPDockingPaneOffice2007VisioTheme

CXTPDockingPaneOffice2007VisioTheme::CXTPDockingPaneOffice2007VisioTheme()
{

}

///////////////////////////////////////////////////////////////////////////////
// CXTPDockingPaneOffice2003Theme

CXTPDockingPaneOffice2003Theme::CXTPDockingPaneOffice2003Theme()
{
	m_bDrawGripper = TRUE;
	m_bRoundedCaption = TRUE;
	m_nCaptionFontGap = 7;
	m_bUseBoldCaptionFont = TRUE;

	m_pPanelPaintManager->SetAppearance(xtpTabAppearancePropertyPageFlat);
	m_pPanelPaintManager->SetColor(xtpTabColorOffice2003);
	m_pPanelPaintManager->m_bHotTracking = TRUE;

	m_pTabPaintManager->SetAppearance(xtpTabAppearancePropertyPageFlat);
	m_pTabPaintManager->SetColor(xtpTabColorOffice2003);
	m_pTabPaintManager->m_bHotTracking = TRUE;

	m_nCaptionButtonStyle = xtpPaneCaptionButtonOffice2003;
}

CXTPDockingPaneOffice2003Theme::~CXTPDockingPaneOffice2003Theme()
{

}


void CXTPDockingPaneOffice2003Theme::RefreshMetrics()
{
	CXTPDockingPaneVisualStudio2003Theme::RefreshMetrics();

	m_clrNormalCaption.SetStandardValue(XTPColorManager()->LightColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 0xcd), GetXtremeColor(COLOR_3DFACE));
	m_clrNormalCaptionText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));

	m_clrActiveCaption.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT_CHECKED));
	m_clrActiveCaptionText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));

	m_bLunaTheme = FALSE;

	if (XTPColorManager()->IsLowResolution())
	{
		m_clrNormalCaption.SetStandardValue(GetXtremeColor(COLOR_3DFACE));
		m_clrActiveCaption.SetStandardValue(GetXtremeColor(COLOR_HIGHLIGHT));
		m_clrActiveCaptionText.SetStandardValue(GetXtremeColor(COLOR_HIGHLIGHTTEXT));
	}

	XTPCurrentSystemTheme systemTheme = GetCurrentSystemTheme();

	switch (systemTheme)
	{
	case xtpSystemThemeBlue:
	case xtpSystemThemeRoyale:
	case xtpSystemThemeAero:
		{
			m_clrNormalCaption.SetStandardValue(RGB(221, 236, 254), RGB(129, 169, 226), 0.75f);
			m_clrSplitter.SetStandardValue(RGB(216, 231, 252));
			m_clrSplitterGripper.SetStandardValue(GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER));

			INT nElements[] =
			{
				XPCOLOR_TOOLBAR_GRIPPER, XPCOLOR_SEPARATOR, XPCOLOR_DISABLED, XPCOLOR_MENUBAR_FACE, XPCOLOR_MENUBAR_BORDER, XPCOLOR_HIGHLIGHT, XPCOLOR_HIGHLIGHT_BORDER, XPCOLOR_HIGHLIGHT_PUSHED_BORDER, XPCOLOR_HIGHLIGHT_CHECKED_BORDER, XPCOLOR_HIGHLIGHT_PUSHED, XPCOLOR_HIGHLIGHT_CHECKED, XPCOLOR_TOOLBAR_FACE, XPCOLOR_PUSHED_TEXT
			};
			COLORREF clrValues[] =
			{
				RGB(39, 65, 118), RGB(106, 140, 203), RGB(109, 150, 208), RGB(246, 246, 246), RGB(0, 45, 150), RGB(255, 238, 194), RGB(0, 0, 128), RGB(0, 0, 128), RGB(0, 0, 128), RGB(254, 128, 62), RGB(255, 192, 111), RGB(158, 190, 245), 0
			};
			SetColors(sizeof(nElements)/sizeof(INT), nElements, clrValues);

			m_bLunaTheme = TRUE;

		}
		break;

	case xtpSystemThemeOlive:
		{
			m_clrNormalCaption.SetStandardValue(RGB(244, 247, 222), RGB(183, 198, 145), 0.3f);
			m_clrSplitter.SetStandardValue(RGB(226, 231, 191));
			m_clrSplitterGripper.SetStandardValue(GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER));

			INT nElements[] =
			{
				XPCOLOR_TOOLBAR_GRIPPER, XPCOLOR_SEPARATOR, XPCOLOR_DISABLED, XPCOLOR_MENUBAR_FACE, XPCOLOR_MENUBAR_BORDER, XPCOLOR_HIGHLIGHT, XPCOLOR_HIGHLIGHT_BORDER, XPCOLOR_HIGHLIGHT_CHECKED_BORDER, XPCOLOR_HIGHLIGHT_PUSHED_BORDER, XPCOLOR_HIGHLIGHT_PUSHED, XPCOLOR_HIGHLIGHT_CHECKED, XPCOLOR_TOOLBAR_FACE, XPCOLOR_PUSHED_TEXT
			};
			COLORREF clrValues[] =
			{
				RGB(81, 94, 51), RGB(96, 128, 88), RGB(159, 174, 122), RGB(244, 244, 238), RGB(117, 141, 94), RGB(255, 238, 194), RGB(63, 93, 56), RGB(63, 93, 56), RGB(63, 93, 56), RGB(254, 128, 62), RGB(255, 192, 111), RGB(217, 217, 167), 0
			};
			SetColors(sizeof(nElements)/sizeof(INT), nElements, clrValues);

			m_bLunaTheme = TRUE;
		}
		break;

	case xtpSystemThemeSilver:
		{
			m_clrNormalCaption.SetStandardValue(RGB(249, 249, 255), RGB(156, 155, 183), 0.75f);
			m_clrSplitter.SetStandardValue(RGB(223, 223, 234));
			m_clrSplitterGripper.SetStandardValue(GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER));

			INT nElements[] =
			{
				XPCOLOR_TOOLBAR_GRIPPER, XPCOLOR_SEPARATOR, XPCOLOR_DISABLED, XPCOLOR_MENUBAR_FACE, XPCOLOR_MENUBAR_BORDER, XPCOLOR_HIGHLIGHT, XPCOLOR_HIGHLIGHT_BORDER, XPCOLOR_HIGHLIGHT_CHECKED_BORDER, XPCOLOR_HIGHLIGHT_PUSHED_BORDER, XPCOLOR_HIGHLIGHT_PUSHED, XPCOLOR_HIGHLIGHT_CHECKED, XPCOLOR_TOOLBAR_FACE, XPCOLOR_PUSHED_TEXT
			};
			COLORREF clrValues[] =
			{
				RGB(84, 84, 117), RGB(110, 109, 143), RGB(168, 167, 190), RGB(253, 250, 255), RGB(124, 124, 148), RGB(255, 238, 194), RGB(75, 75, 111), RGB(75, 75, 111), RGB(75, 75, 111), RGB(254, 128, 62), RGB(255, 192, 111), RGB(215, 215, 229), 0
			};
			SetColors(sizeof(nElements)/sizeof(INT), nElements, clrValues);

			m_bLunaTheme = TRUE;
		}
		break;
	}

	if (m_bLunaTheme)
	{
		m_clrActiveCaption.SetStandardValue(RGB(255, 213, 140), RGB(255, 166, 76));
		m_clrSplitterGradient.SetStandardValue(XTPColorManager()->grcDockBar);
	}


}

CRect CXTPDockingPaneOffice2003Theme::GetCaptionGripperRect(const CXTPDockingPaneTabbedContainer* /*pPane*/)
{
	return CRect(0, 0, 10, m_nTitleHeight);
}

CRect CXTPDockingPaneOffice2003Theme::GetPaneCaptionRect(const CXTPDockingPaneSidePanel* pPane)
{
	CXTPClientRect rect(pPane);
	rect.DeflateRect(1, 1);

	int nTitleFont = GetCaptionHeight() + 2;
	XTPDockingPaneDirection direction = pPane->GetDirection();

	if (direction == xtpPaneDockLeft) rect.right = rect.left + nTitleFont;
	else if (direction == xtpPaneDockRight) rect.left = rect.right - nTitleFont;
	else if (direction == xtpPaneDockTop) rect.bottom = rect.top + nTitleFont;
	else if (direction == xtpPaneDockBottom) rect.top = rect.bottom - nTitleFont;

	return rect;
}

int CXTPDockingPanePaintManager::DrawCaptionText(CDC* pDC, const CString& strTitle, CRect rcText, BOOL bVertical, BOOL bCalcWidth)
{
	int nWidth = 0;
	if (strTitle.IsEmpty())
		return 0;

	if (bVertical)
	{
		CXTPFontDC font(pDC, &m_fntTitleVertical);

		CSize sz = pDC->GetTextExtent(strTitle);
		if (rcText.bottom > rcText.top)
		{
			rcText.left = (rcText.right - (rcText.Width() - sz.cy) / 2);
			rcText.right = rcText.left + rcText.Height();

			pDC->DrawText(strTitle, rcText, DT_NOPREFIX | DT_SINGLELINE | DT_NOCLIP | DT_END_ELLIPSIS);
		}
		nWidth = sz.cx;
	}
	else
	{
		CXTPFontDC font(pDC, &m_fntTitle);
		pDC->DrawText(strTitle, rcText, DT_SINGLELINE | DT_END_ELLIPSIS | DT_VCENTER | DT_NOPREFIX);

		if (bCalcWidth)
		{
			CXTPEmptyRect rcCalc;
			pDC->DrawText(strTitle, rcCalc, DT_CALCRECT | DT_SINGLELINE | DT_NOPREFIX);
			nWidth = rcCalc.Width();
		}
	}
	return nWidth;
}

CXTPDockingPane* CXTPDockingPanePaintManager::GetSelectedPane(CXTPDockingPaneBase* pPane)
{
	if (pPane->GetType() == xtpPaneTypeTabbedContainer)
	{
		return ((CXTPDockingPaneTabbedContainer*)pPane)->GetSelected();
	}
	if (pPane->GetType() == xtpPaneTypeSidePanel)
	{
		return ((CXTPDockingPaneSidePanel*)pPane)->GetSelectedPane();
	}
	else if (pPane->GetType() == xtpPaneTypeMiniWnd)
	{
		CXTPDockingPaneBaseList lst;
		pPane->FindPane(xtpPaneTypeTabbedContainer, &lst);

		if (lst.GetCount() == 1)
		{
			return ((CXTPDockingPaneTabbedContainer*)lst.GetHead())->GetSelected();
		}
	}
	return NULL;
}

BOOL CXTPDockingPanePaintManager::IsCaptionEnabled(CXTPDockingPaneBase* pPane)
{
	CXTPDockingPane* pSelectedPane = GetSelectedPane(pPane);
	if (!pSelectedPane)
		return TRUE;
	return pSelectedPane->GetEnabled() & xtpPaneEnableClient;
}

void CXTPDockingPanePaintManager::DrawCaptionIcon(CDC* pDC, CXTPDockingPaneBase* pPane, CRect& rcCaption, BOOL bVertical)
{
	if (!m_bDrawCaptionIcon)
		return;

	CSize szIcon = GetTabPaintManager()->m_szIcon;

	CXTPDockingPane* pSelectedPane = GetSelectedPane(pPane);
	CXTPImageManagerIcon* pImage = pSelectedPane ? pSelectedPane->GetIcon(szIcon.cx) : NULL;

	if (!pImage)
		return;

	BOOL bEnabled = IsCaptionEnabled(pPane);
	CXTPImageManagerIconHandle& imageHandle = !bEnabled ? pImage->GetDisabledIcon(): pImage->GetIcon();

	if (!bVertical && rcCaption.Width() >= szIcon.cx)
	{
		pImage->Draw(pDC, CPoint(rcCaption.left, rcCaption.CenterPoint().y - szIcon.cy / 2),
			imageHandle, szIcon);

		rcCaption.left += szIcon.cx + 3;
	}
	else if (bVertical && rcCaption.Height() >= szIcon.cy)
	{
		pImage->Draw(pDC, CPoint(rcCaption.CenterPoint().x - szIcon.cy / 2, rcCaption.top),
			imageHandle, szIcon);

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

void CXTPDockingPaneOffice2003Theme::DrawCaptionPart(CDC* pDC, CXTPDockingPaneBase* pPane, CRect rcCaption, const CString& strTitle, BOOL bActive, BOOL bVertical)
{
	COLORREF clrText = bActive ? m_clrActiveCaptionText : m_clrNormalCaptionText ;

	XTPDeflateRectDirection(rcCaption, 0, 0, 4, 0, bVertical);
	DrawCaptionButtons(pDC, pPane->GetCaptionButtons(), rcCaption, clrText, 16, 0, bVertical);

	if (!bVertical && m_bDrawGripper && (rcCaption.right > rcCaption.left + 7))
	{
		for (int y = rcCaption.top + 5; y < rcCaption.bottom - 3; y += 4)
		{
			pDC->FillSolidRect(rcCaption.left + 4 + 2, y + 1, 2, 2, GetXtremeColor(COLOR_WINDOW));
			pDC->FillSolidRect(rcCaption.left + 3 + 2, y, 2, 2, GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER));
		}
		rcCaption.left += 8;
	}

	if (bVertical && m_bDrawGripper && (rcCaption.bottom > rcCaption.top + 7))
	{
		for (int x = rcCaption.left + 3; x < rcCaption.right - 5; x += 4)
		{
			pDC->FillSolidRect(x + 2, rcCaption.top + 4 + 2, 2, 2, GetXtremeColor(COLOR_WINDOW));
			pDC->FillSolidRect(x + 1, rcCaption.top + 3 + 2, 2, 2, GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER));
		}
		rcCaption.top += 8;
	}

	pDC->SetTextColor(IsCaptionEnabled(pPane) ? clrText : m_clrDisabledCaptionText);

	XTPDeflateRectDirection(rcCaption, 6, 1, 2, 0, bVertical);

	DrawCaptionIcon(pDC, pPane, rcCaption, bVertical);
	DrawCaptionText(pDC, strTitle, rcCaption, bVertical);
}

void CXTPDockingPaneOffice2003Theme::DrawFloatingFrame(CDC* pDC, CXTPDockingPaneMiniWnd* pPane, CRect rc)
{
	COLORREF clrFrame = GetXtremeColor(XPCOLOR_MENUBAR_BORDER);

	pDC->Draw3dRect(rc, clrFrame, clrFrame);
	rc.DeflateRect(1, 1);
	pDC->Draw3dRect(rc, clrFrame, clrFrame);
	rc.DeflateRect(1, 1);

	pDC->Draw3dRect(rc, clrFrame, clrFrame);
	XTPDrawHelpers()->ExcludeCorners(pDC, rc);
	pDC->Draw3dRect(rc, m_clrNormalCaption.clrDark, m_clrNormalCaption.clrDark);

	int nTitleHeight = m_nTitleHeight;
	CRect rcCaption(rc);
	rcCaption.DeflateRect(0, 0, 0, rc.Height() - nTitleHeight - 3);

	CXTPBufferDC dcCache(*pDC, rcCaption);
	dcCache.SetBkMode(TRANSPARENT);

	BOOL bActive = m_bHighlightActiveCaption && pPane->IsActive();

	XTPDrawHelpers()->GradientFill(&dcCache, rcCaption,
		bActive ? m_clrActiveCaption : m_clrNormalCaption, FALSE);

	dcCache.SetPixel(rcCaption.left, rcCaption.bottom, m_clrNormalCaption.clrDark);
	dcCache.SetPixel(rcCaption.right - 1, rcCaption.bottom, m_clrNormalCaption.clrDark);

	rcCaption.DeflateRect(1, 0);

	CString strTitle;
	pPane->GetWindowText(strTitle);

	DrawCaptionPart(&dcCache, pPane, rcCaption, strTitle, bActive, FALSE);
}

void CXTPDockingPaneOffice2003Theme::DrawSidePanel(CDC* pDC, CXTPDockingPaneSidePanel* pPane, CRect rc)
{
	BOOL bActive = m_bHighlightActiveCaption && pPane->IsActive();

	pDC->FillSolidRect(rc, bActive ? m_clrActiveCaption : m_clrNormalCaption);
	pDC->SetBkMode(TRANSPARENT);

	pDC->Draw3dRect(rc, GetXtremeColor(COLOR_WINDOWFRAME), GetXtremeColor(COLOR_WINDOWFRAME));
	rc.DeflateRect(1, 1);

	CRect rcCaption = rc;
	int nTitleFont = GetCaptionHeight() + 2;
	XTPDockingPaneDirection direction = pPane->GetDirection();

	if (direction == xtpPaneDockLeft) rcCaption.right = rcCaption.left + nTitleFont;
	else if (direction == xtpPaneDockRight) rcCaption.left = rcCaption.right - nTitleFont;
	else if (direction == xtpPaneDockTop) rcCaption.bottom = rcCaption.top + nTitleFont;
	else if (direction == xtpPaneDockBottom) rcCaption.top = rcCaption.bottom - nTitleFont;


	BOOL bVertical = direction == xtpPaneDockLeft || direction == xtpPaneDockRight;

	XTPDrawHelpers()->GradientFill(pDC, rcCaption, bActive ? m_clrActiveCaption : m_clrNormalCaption, bVertical);

	DrawCaptionPart(pDC, pPane, rcCaption, pPane->GetTitle(), bActive, bVertical);
}

void CXTPDockingPaneOffice2003Theme::DrawCaption(CDC* pDC, CXTPDockingPaneTabbedContainer* pPane, CRect rc)
{
	BOOL bVertical = pPane->IsCaptionVertical();

	int nTitleHeight = m_nTitleHeight;
	CRect rcCaption(rc);

	if (bVertical)
	{
		rcCaption.DeflateRect(0, 0, rc.Width() - nTitleHeight - 3, 0);
	}
	else
	{
		rcCaption.DeflateRect(0, 0, 0, rc.Height() - nTitleHeight - 3);
	}

	CRect rcFill(rcCaption);

	if (m_bRoundedCaption)
	{
		XTPDeflateRectDirection(rcFill, 1, 0, 0, 0, bVertical);
		pDC->FillSolidRect(rcCaption, m_clrSplitter);

		XTPDrawHelpers()->ExcludeCorners(pDC, rcFill);
	}

	BOOL bActive = m_bHighlightActiveCaption && pPane->IsActive();

	XTPDrawHelpers()->GradientFill(pDC, rcFill,
		bActive ? m_clrActiveCaption : m_clrNormalCaption, bVertical);

	if (!m_bRoundedCaption)
	{
		pDC->FillSolidRect(rcCaption.left, rcCaption.top, 1, rcCaption.Height(), GetXtremeColor(XPCOLOR_FRAME));
		pDC->FillSolidRect(rcCaption.left, rcCaption.top, rcCaption.Width(), 1, GetXtremeColor(XPCOLOR_FRAME));
		pDC->FillSolidRect(rcCaption.right - 1, rcCaption.top, 1, rcCaption.Height(), GetXtremeColor(XPCOLOR_FRAME));
	}

	CString strTitle = pPane->GetTitle();
	DrawCaptionPart(pDC, pPane, rcCaption, strTitle, bActive, bVertical);
}


//////////////////////////////////////////////////////////////////////////
// CXTPDockingPaneOffice2007Theme

CXTPDockingPaneOffice2007Theme::CXTPDockingPaneOffice2007Theme()
{
	m_bRoundedCaption = FALSE;
	m_dwSplitterStyle = xtpPaneSplitterGradientVert;
	m_bDrawGripper = FALSE;

	m_pPanelPaintManager->SetAppearance(xtpTabAppearancePropertyPage2007);
	m_pPanelPaintManager->m_bHotTracking = TRUE;

	m_pTabPaintManager->SetAppearance(xtpTabAppearancePropertyPage2007);
	m_pTabPaintManager->m_bHotTracking = TRUE;

	m_pPanelPaintManager->m_rcButtonMargin.SetRect(2, 1, 2, 1);
	m_pTabPaintManager->m_rcButtonMargin.SetRect(2, 1, 2, 1);

	m_nCaptionFontGap = 5;
}

void CXTPDockingPaneOffice2007Theme::DrawCaption(CDC* pDC, CXTPDockingPaneTabbedContainer* pPane, CRect rc)
{
	BOOL bVertical = pPane->IsCaptionVertical();

	int nTitleHeight = m_nTitleHeight;
	CRect rcCaption(rc);

	if (bVertical)
	{
		rcCaption.DeflateRect(0, 0, rc.Width() - nTitleHeight - 3, 0);
	}
	else
	{
		rcCaption.DeflateRect(0, 0, 0, rc.Height() - nTitleHeight - 3);
	}

	BOOL bActive = m_bHighlightActiveCaption && pPane->IsActive();

	XTPDrawHelpers()->GradientFill(pDC, rcCaption,  bActive ? m_clrActiveCaption : m_clrNormalCaption, bVertical);

	DrawCaptionPart(pDC, pPane, rcCaption, pPane->GetTitle(), bActive, bVertical);
}

void CXTPDockingPaneOffice2007Theme::RefreshMetrics()
{
	CXTPDockingPaneOffice2003Theme::RefreshMetrics();

	CXTPResourceImages* pImages = XTPResourceImages();

	if (pImages->IsValid())
	{
		m_arrColor[XPCOLOR_FRAME] = pImages->GetImageColor(_T("Window"), _T("WindowFrame"));
		m_arrColor[XPCOLOR_3DFACE] = pImages->GetImageColor(_T("Window"), _T("ButtonFace"));
		m_arrColor[COLOR_3DHIGHLIGHT] = pImages->GetImageColor(_T("Window"), _T("EdgeHighLightColor"));

		m_clrSplitter.SetStandardValue(pImages->GetImageColor(_T("DockingPane"), _T("Splitter")));
		m_clrSplitterGripper.SetStandardValue(m_arrColor[XPCOLOR_FRAME]);

		m_arrColor[XPCOLOR_TOOLBAR_GRIPPER] = pImages->GetImageColor(_T("Toolbar"), _T("ToolbarGripper"));
		m_arrColor[XPCOLOR_MENUBAR_BORDER] = pImages->GetImageColor(_T("Toolbar"), _T("MenuPopupBorder"));

		m_bLunaTheme = TRUE;

		m_clrSplitterGradient.SetStandardValue(pImages->GetImageColor(_T("DockingPane"), _T("SplitterLight")),
			pImages->GetImageColor(_T("DockingPane"), _T("SplitterDark")));

		m_clrNormalCaption.SetStandardValue(pImages->GetImageColor(_T("DockingPane"), _T("NormalCaptionLight")),
			pImages->GetImageColor(_T("DockingPane"), _T("NormalCaptionDark")), 0.25f);
		m_clrNormalCaptionText.SetStandardValue(pImages->GetImageColor(_T("DockingPane"), _T("NormalCaptionText")));

		m_clrActiveCaption.SetStandardValue(pImages->GetImageColor(_T("DockingPane"), _T("ActiveCaptionLight")),
			pImages->GetImageColor(_T("DockingPane"), _T("ActiveCaptionDark")), 0.25f);
		m_clrActiveCaptionText.SetStandardValue(pImages->GetImageColor(_T("DockingPane"), _T("ActiveCaptionText")));

	}
	else
	{
		m_arrColor[XPCOLOR_FRAME] = RGB(101, 147, 207);
		m_arrColor[XPCOLOR_3DFACE] = RGB(191, 219, 255);
		m_arrColor[COLOR_3DHIGHLIGHT] = RGB(255, 255, 255);

		m_clrNormalCaption.SetStandardValue(RGB(227, 239, 255), RGB(175, 210, 255), 0.25f);
		m_clrSplitter.SetStandardValue(RGB(216, 231, 252));
		m_clrSplitterGripper.SetStandardValue(GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER));
		m_clrSplitterGradient.SetStandardValue(RGB(190, 218, 254), RGB(100, 143, 203));

		INT nElements[] =
		{
			XPCOLOR_TOOLBAR_GRIPPER, XPCOLOR_SEPARATOR, XPCOLOR_DISABLED, XPCOLOR_MENUBAR_FACE, XPCOLOR_MENUBAR_BORDER, XPCOLOR_HIGHLIGHT, XPCOLOR_HIGHLIGHT_BORDER, XPCOLOR_HIGHLIGHT_PUSHED_BORDER, XPCOLOR_HIGHLIGHT_CHECKED_BORDER, XPCOLOR_HIGHLIGHT_PUSHED, XPCOLOR_HIGHLIGHT_CHECKED, XPCOLOR_TOOLBAR_FACE, XPCOLOR_PUSHED_TEXT
		};
		COLORREF clrValues[] =
		{
			RGB(39, 65, 118), RGB(106, 140, 203), RGB(109, 150, 208), RGB(246, 246, 246), RGB(0, 45, 150), RGB(255, 238, 194), RGB(0, 0, 128), RGB(0, 0, 128), RGB(0, 0, 128), RGB(254, 128, 62), RGB(255, 192, 111), RGB(158, 190, 245), 0
		};
		SetColors(sizeof(nElements)/sizeof(INT), nElements, clrValues);

		m_bLunaTheme = TRUE;

		m_clrActiveCaption.SetStandardValue(RGB(255, 231, 162), RGB(255, 166, 76));
		m_clrNormalCaptionText.SetStandardValue(RGB(8, 55, 114));
		m_clrActiveCaptionText.SetStandardValue(RGB(8, 55, 114));
	}
}


//////////////////////////////////////////////////////////////////////////
// CXTPDockingPaneOffice2007OutlookTheme

CXTPDockingPaneOffice2007OutlookTheme::CXTPDockingPaneOffice2007OutlookTheme()
{
	m_nCaptionFontGap = 3;
}

void CXTPDockingPaneOffice2007OutlookTheme::DrawCaption(CDC* pDC, CXTPDockingPaneTabbedContainer* pPane, CRect rc)
{
	BOOL bVertical = pPane->IsCaptionVertical();

	int nTitleHeight = m_nTitleHeight;
	CRect rcCaption(rc);

	if (bVertical)
	{
		rcCaption.DeflateRect(0, 0, rc.Width() - nTitleHeight - 3, 0);
	}
	else
	{
		rcCaption.DeflateRect(0, 0, 0, rc.Height() - nTitleHeight - 3);
	}

	BOOL bActive = m_bHighlightActiveCaption && pPane->IsActive();

	XTPDrawHelpers()->GradientFill(pDC, rcCaption,  bActive ? m_clrActiveCaption : m_clrNormalCaption, bVertical);

	if (bVertical)
	{
		pDC->FillSolidRect(rcCaption.left, rcCaption.top, rcCaption.Width(), 1, GetXtremeColor(XPCOLOR_FRAME));
		pDC->FillSolidRect(rcCaption.left, rcCaption.top, 1, rcCaption.Height(), GetXtremeColor(XPCOLOR_FRAME));
		pDC->FillSolidRect(rcCaption.left, rcCaption.bottom - 1, rcCaption.Width(), 1, GetXtremeColor(XPCOLOR_FRAME));

		pDC->FillSolidRect(rcCaption.left + 1, rcCaption.top + 1, rcCaption.Width() - 1, 1, GetXtremeColor(COLOR_3DHIGHLIGHT));
		pDC->FillSolidRect(rcCaption.left + 1, rcCaption.top + 1, 1, rcCaption.Height() - 2, GetXtremeColor(COLOR_3DHIGHLIGHT));

	}
	else
	{
		pDC->FillSolidRect(rcCaption.left, rcCaption.top, rcCaption.Width(), 1, GetXtremeColor(XPCOLOR_FRAME));
		pDC->FillSolidRect(rcCaption.left, rcCaption.top, 1, rcCaption.Height(), GetXtremeColor(XPCOLOR_FRAME));
		pDC->FillSolidRect(rcCaption.right - 1, rcCaption.top, 1, rcCaption.Height(), GetXtremeColor(XPCOLOR_FRAME));

		pDC->FillSolidRect(rcCaption.left + 1, rcCaption.top + 1, rcCaption.Width() - 2, 1, GetXtremeColor(COLOR_3DHIGHLIGHT));
		pDC->FillSolidRect(rcCaption.left + 1, rcCaption.top + 1, 1, rcCaption.Height() - 1, GetXtremeColor(COLOR_3DHIGHLIGHT));
	}

	DrawCaptionPart(pDC, pPane, rcCaption, pPane->GetTitle(), bActive, bVertical);
}

void CXTPDockingPaneOffice2007OutlookTheme::RefreshMetrics()
{
	CXTPDockingPaneOffice2007Theme::RefreshMetrics();

	if (m_bUseStandardFont)
	{
		LOGFONT lf;
		VERIFY(CXTPDrawHelpers::GetIconLogFont(&lf));

		CString strOfficeFont = _T("Segoe UI");

		BOOL bOfficeFont = XTPDrawHelpers()->FontExists(m_strOfficeFont);

		if (bOfficeFont)
		{
			STRCPY_S(lf.lfFaceName, LF_FACESIZE, strOfficeFont);
			if (XTPSystemVersion()->IsClearTypeTextQualitySupported()) lf.lfQuality = 5;
		}
		else
		{
			STRCPY_S(lf.lfFaceName, LF_FACESIZE, _T("Arial"));
		}

		lf.lfWeight = FW_BOLD;
		lf.lfHeight = 20;

		SetCaptionFontIndirect(&lf);
	}
}

//////////////////////////////////////////////////////////////////////////
// CXTPDockingPaneOffice2007WordTheme


CXTPDockingPaneOffice2007WordTheme::CXTPDockingPaneOffice2007WordTheme()
{
	m_bRoundedCaption = FALSE;
	m_dwSplitterStyle = xtpPaneSplitterFlat;
	m_bDrawGripper = FALSE;

	m_pPanelPaintManager->SetAppearance(xtpTabAppearancePropertyPageAccess2007);
	m_pPanelPaintManager->m_bHotTracking = TRUE;

	m_pTabPaintManager->SetAppearance(xtpTabAppearancePropertyPageAccess2007);
	m_pTabPaintManager->m_bHotTracking = TRUE;

	m_nCaptionFontGap = 2;
	m_nSplitterSize = 0;
	m_nSplitterIndent = 2;
}

void CXTPDockingPaneOffice2007WordTheme::DrawCaption(CDC* pDC, CXTPDockingPaneTabbedContainer* pPane, CRect rc)
{
	BOOL bVertical = pPane->IsCaptionVertical();

	int nTitleHeight = m_nTitleHeight;
	CRect rcCaption(rc);

	if (bVertical)
	{
		rcCaption.DeflateRect(0, 0, rc.Width() - nTitleHeight - 3, 0);
	}
	else
	{
		rcCaption.DeflateRect(0, 0, 0, rc.Height() - nTitleHeight - 3);
	}

	CRect rcFill(rcCaption);

	BOOL bActive = m_bHighlightActiveCaption && pPane->IsActive();

	XTPDrawHelpers()->GradientFill(pDC, rcFill, bActive ? m_clrActiveCaption : m_clrNormalCaption, bVertical);

	CString strTitle = pPane->GetTitle();
	DrawCaptionPart(pDC, pPane, rcCaption, strTitle, bActive, bVertical);
}

void CXTPDockingPaneOffice2007WordTheme::DrawCaptionPart(CDC* pDC, CXTPDockingPaneBase* pPane, CRect rcCaption, const CString& strTitle, BOOL bActive, BOOL bVertical)
{
	COLORREF clrText = bActive ? m_clrActiveCaptionText : m_clrNormalCaptionText;

	DrawCaptionButtons(pDC, pPane->GetCaptionButtons(), rcCaption, clrText, 16, 0, bVertical);

	pDC->SetTextColor(IsCaptionEnabled(pPane) ? clrText : m_clrDisabledCaptionText);

	XTPDeflateRectDirection(rcCaption, 2, 1, 2, 0, bVertical);

	DrawCaptionIcon(pDC, pPane, rcCaption, bVertical);
	DrawCaptionText(pDC, strTitle, rcCaption, bVertical);

}

BOOL CXTPDockingPaneOffice2007WordTheme::PaneHasBorders(CXTPDockingPaneTabbedContainer* pPane) const
{
	return pPane->IsTitleVisible();
}

void CXTPDockingPaneOffice2007WordTheme::AdjustClientRect(CXTPDockingPaneTabbedContainer* pPane, CRect& rect, BOOL bApply)
{
	if (PaneHasBorders(pPane))
	{
		rect.DeflateRect(3, 3);
	}
	CXTPDockingPaneOffice2003Theme::AdjustClientRect(pPane, rect, bApply);
}

void CXTPDockingPaneOffice2007WordTheme::DrawPane(CDC* pDC, CXTPDockingPaneTabbedContainer* pPane, CRect rc)
{
	if (m_bOffice2010Style)
	{
		pDC->FillSolidRect(rc, m_arrColor[XPCOLOR_3DFACE]);
		pDC->Draw3dRect(rc.left, rc.top, rc.Width(), rc.Height(), m_arrColor[XPCOLOR_TOOLBAR_GRIPPER], m_arrColor[XPCOLOR_TOOLBAR_GRIPPER]);
		rc.DeflateRect(3, 3);
	}
	else
	{
		if (PaneHasBorders(pPane))
		{
			pDC->FillSolidRect(rc, m_arrColor[XPCOLOR_FRAME]);

			pDC->FillSolidRect(rc.left + 3, rc.top + 2, rc.Width() - 6, 1, m_arrColor[XPCOLOR_TOOLBAR_GRIPPER]);
			pDC->FillSolidRect(rc.left + 2, rc.top + 3, 1, rc.Height() - 5, m_arrColor[XPCOLOR_TOOLBAR_GRIPPER]);
			pDC->FillSolidRect(rc.right - 3, rc.top + 3, 1, rc.Height() - 5, m_arrColor[XPCOLOR_TOOLBAR_GRIPPER]);
			pDC->FillSolidRect(rc.left + 2, rc.bottom - 3, rc.Width() - 4, 1, m_arrColor[XPCOLOR_TOOLBAR_GRIPPER]);

			rc.DeflateRect(3, 3);
		}
	}

	CXTPDockingPaneOffice2003Theme::DrawPane(pDC, pPane, rc);
}

void CXTPDockingPaneOffice2007WordTheme::RefreshMetrics()
{
	CXTPDockingPaneOffice2003Theme::RefreshMetrics();

	CXTPResourceImages* pImages = XTPResourceImages();
	pImages->AssertValid();


	m_bOffice2010Style = pImages->GetImageInt(_T("DockingPane"), _T("Office2010Style"), FALSE);

	m_arrColor[XPCOLOR_FRAME] = pImages->GetImageColor(_T("DockingPane"), _T("WordSplitter"));
	m_arrColor[XPCOLOR_3DFACE] = pImages->GetImageColor(_T("DockingPane"), _T("WordPaneBackground"));
	m_arrColor[COLOR_3DHIGHLIGHT] = pImages->GetImageColor(_T("Window"), _T("EdgeHighLightColor"));


	m_arrColor[XPCOLOR_TOOLBAR_GRIPPER] = pImages->GetImageColor(_T("DockingPane"), _T("WordPaneBorder"));
	m_arrColor[XPCOLOR_MENUBAR_BORDER] = pImages->GetImageColor(_T("DockingPane"), _T("WordSplitter"));

	m_arrColor[XPCOLOR_HIGHLIGHT_BORDER] = pImages->GetImageColor(_T("Window"), _T("HighlightSelectedBorder"));
	m_arrColor[XPCOLOR_HIGHLIGHT] = pImages->GetImageColor(_T("Window"), _T("HighlightSelected"));
	m_arrColor[XPCOLOR_HIGHLIGHT_PUSHED_BORDER] = pImages->GetImageColor(_T("Window"), _T("HighlightPressedBorder"));
	m_arrColor[XPCOLOR_HIGHLIGHT_PUSHED] = pImages->GetImageColor(_T("Window"), _T("HighlightPressed"));
	m_arrColor[XPCOLOR_HIGHLIGHT_TEXT] = 0;
	m_arrColor[XPCOLOR_PUSHED_TEXT] = 0;

	m_bLunaTheme = FALSE;

	m_clrSplitterGradient.SetStandardValue(pImages->GetImageColor(_T("DockingPane"), _T("WordSplitter")));
	m_clrSplitter.SetStandardValue(m_clrSplitterGradient);

	m_clrNormalCaption.SetStandardValue(pImages->GetImageColor(_T("DockingPane"), _T("WordNormalCaption")));
	m_clrNormalCaptionText.SetStandardValue(pImages->GetImageColor(_T("DockingPane"), _T("WordCaptionText")));

	m_clrActiveCaption.SetStandardValue(pImages->GetImageColor(_T("DockingPane"), _T("WordActiveCaption")));
	m_clrActiveCaptionText.SetStandardValue(pImages->GetImageColor(_T("DockingPane"), _T("WordCaptionText")));
	m_clrSplitterGripper.SetStandardValue(m_clrNormalCaptionText);

	if (m_bOffice2010Style)
	{
		m_nSplitterSize = 4;
		m_nSplitterIndent = 0;
	}
	else
	{
		m_nSplitterSize = 0;
		m_nSplitterIndent = 2;
	}

	if (m_bOffice2010Style)
	{
		m_arrColor[XPCOLOR_MENUBAR_BORDER] = m_arrColor[XPCOLOR_TOOLBAR_GRIPPER];
	}
}


///////////////////////////////////////////////////////////////////////////////
// CXTPDockingPaneOffice2003OutlookTheme


CXTPDockingPaneOffice2003OutlookTheme::CXTPDockingPaneOffice2003OutlookTheme()
{
	m_bDrawGripper = FALSE;
	m_bRoundedCaption = FALSE;
	m_nCaptionFontGap = 3;
}

CXTPDockingPaneOffice2003OutlookTheme::~CXTPDockingPaneOffice2003OutlookTheme()
{
}


void CXTPDockingPaneOffice2003OutlookTheme::RefreshMetrics()
{
	CXTPDockingPaneOffice2003Theme::RefreshMetrics();

	if (m_bUseStandardFont)
	{
		LOGFONT lf;
		VERIFY(CXTPDrawHelpers::GetIconLogFont(&lf));

		STRCPY_S(lf.lfFaceName, LF_FACESIZE, _T("Arial"));
		lf.lfWeight = FW_BOLD;
		lf.lfHeight = 20;

		SetCaptionFontIndirect(&lf);
	}

	if (m_bLunaTheme)
	{
		m_clrNormalCaption.SetStandardValue(XTPColorManager()->grcCaption);
		m_clrNormalCaptionText.SetStandardValue(RGB(255, 255, 255));
	}
	else
	{
		m_clrNormalCaption.SetStandardValue(XTPColorManager()->LightColor(
			GetXtremeColor(COLOR_3DSHADOW), GetXtremeColor(COLOR_WINDOW), 0xcd),
			GetXtremeColor(COLOR_3DSHADOW));
	}
}

CRect CXTPDockingPaneOffice2003OutlookTheme::GetCaptionGripperRect(const CXTPDockingPaneTabbedContainer* /*pPane*/)
{
	return CRect(0, 0, 0, 0);
}


//////////////////////////////////////////////////////////////////////////
///

CXTPDockingPaneWinNativeTheme::CXTPDockingPaneWinNativeTheme()
{
	m_pPanelPaintManager->SetAppearance(xtpTabAppearancePropertyPage);
	m_pPanelPaintManager->SetColor(xtpTabColorWinNative);
	m_pPanelPaintManager->m_bHotTracking = TRUE;

	m_pTabPaintManager->SetAppearance(xtpTabAppearancePropertyPage);
	m_pTabPaintManager->SetColor(xtpTabColorWinNative);
	m_pTabPaintManager->m_bHotTracking = TRUE;

	m_bGradientCaption = TRUE;
	m_nCaptionFontGap = 7;

	m_nCaptionButtonStyle = xtpPaneCaptionButtonThemedExplorerBar;
}

void CXTPDockingPaneWinNativeTheme::RefreshMetrics()
{
	CXTPDockingPaneVisualStudio2003Theme::RefreshMetrics();

	if (m_themeWindow->IsAppThemed())
	{
		m_clrActiveCaptionText.SetStandardValue(GetXtremeColor(COLOR_CAPTIONTEXT));
		m_clrNormalCaptionText.SetStandardValue(GetXtremeColor(COLOR_INACTIVECAPTIONTEXT));
	}
}

void CXTPDockingPaneWinNativeTheme::DrawFloatingFrame(CDC* pDC, CXTPDockingPaneMiniWnd* pPane, CRect rc)
{
	if (!m_themeWindow->IsAppThemed())
	{
		CXTPDockingPaneVisualStudio2003Theme::DrawFloatingFrame(pDC, pPane, rc);
		return;
	}
	BOOL bActive = m_bHighlightActiveCaption && pPane->IsActive();

	int nState = bActive ? CS_ACTIVE : CS_INACTIVE;

	m_themeWindow->DrawThemeBackground(pDC->GetSafeHdc(), WP_SMALLFRAMELEFT, nState, CRect(rc.left, rc.top, rc.left + 3, rc.bottom), 0);
	m_themeWindow->DrawThemeBackground(pDC->GetSafeHdc(), WP_SMALLFRAMERIGHT, nState, CRect(rc.right - 3, rc.top, rc.right, rc.bottom), 0);
	m_themeWindow->DrawThemeBackground(pDC->GetSafeHdc(), WP_SMALLFRAMEBOTTOM, nState, CRect(rc.left, rc.bottom - 3, rc.right, rc.bottom), 0);

	int nTitleHeight = m_nTitleHeight;
	CRect rcCaption(rc);
	rcCaption.DeflateRect(0, 0, 0, rc.Height() - nTitleHeight - 3 - 2);

	CXTPBufferDC dcCache(*pDC, rcCaption);
	dcCache.SetBkMode(TRANSPARENT);

	m_themeWindow->DrawThemeBackground(dcCache, WP_SMALLCAPTION, nState, rcCaption, 0);

	rcCaption.DeflateRect(3, 0);

	CString strTitle;
	pPane->GetWindowText(strTitle);

	DrawCaptionPart(&dcCache, pPane, rcCaption, strTitle, bActive, FALSE);
}

void CXTPDockingPaneWinNativeTheme::DrawSidePanel(CDC* pDC, CXTPDockingPaneSidePanel* pPane, CRect rc)
{
	CXTPDockingPaneVisualStudio2003Theme::DrawSidePanel(pDC, pPane, rc);
}

void CXTPDockingPaneWinNativeTheme::DrawCaptionPart(CDC* pDC, CXTPDockingPaneBase* pPane, CRect rcCaption, const CString& strTitle, BOOL bActive, BOOL bVertical)
{
	if (!m_themeWindow->IsAppThemed())
	{
		CXTPDockingPaneVisualStudio2003Theme::DrawCaptionPart(pDC, pPane, rcCaption, strTitle, bActive, bVertical);
		return;
	}

	COLORREF clrText = bActive ? m_clrActiveCaptionText : m_clrNormalCaptionText;
	COLORREF clrButton = clrText;

	if (pPane->GetType() == xtpPaneTypeSidePanel)
	{
		clrButton = FillCaptionPart(pDC, pPane, rcCaption, bActive, bVertical);
	}

	XTPDeflateRectDirection(rcCaption, 0, 0, 2, 0, bVertical);
	DrawCaptionButtons(pDC, pPane->GetCaptionButtons(), rcCaption, clrButton, 16, 3, bVertical);

	pDC->SetTextColor(IsCaptionEnabled(pPane) ? clrText : m_clrDisabledCaptionText);
	XTPDeflateRectDirection(rcCaption, 4, 1, 0, 0, bVertical);

	DrawCaptionIcon(pDC, pPane, rcCaption, bVertical);
	DrawCaptionText(pDC, strTitle, rcCaption, bVertical);
}

void CXTPDockingPaneWinNativeTheme::DrawCaption(CDC* pDC, CXTPDockingPaneTabbedContainer* pPane, CRect rc)
{
	if (!m_themeWindow->IsAppThemed())
	{
		CXTPDockingPaneVisualStudio2003Theme::DrawCaption(pDC, pPane, rc);
		return;
	}

	BOOL bVertical = pPane->IsCaptionVertical();
	BOOL bActive = m_bHighlightActiveCaption && pPane->IsActive();

	CRect rcCaption(0, 0, rc.right, m_nTitleHeight + 1);
	if (bVertical)
	{
		rcCaption = CRect(0, 0, m_nTitleHeight + 1, rc.bottom);
	}

	m_themeWindow->DrawThemeBackground(pDC->GetSafeHdc(), WP_SMALLCAPTION, bActive ? CS_ACTIVE : CS_INACTIVE, rcCaption, 0);

	CString strTitle = pPane->GetTitle();
	DrawCaptionPart(pDC, pPane, rcCaption, strTitle, bActive, bVertical);
}


//////////////////////////////////////////////////////////////////////////
// CXTPDockingPaneVisualStudio2005Beta1Theme

class CXTPDockingPaneVisualStudio2005Beta1Theme::CColorSetVisualStudio2005 : public CXTPTabPaintManager::CColorSetOffice2003
{
public:
	CColorSetVisualStudio2005(BOOL bHighlightSelected)
	{
		m_bHighlightSelected = bHighlightSelected;
		m_bTransparentButton = FALSE;
		m_bGradientButton = FALSE;

	}
	void RefreshMetrics();

	void XTPFillFramePartRect(CDC* pDC, CRect rc, CWnd* pWnd, CWnd* pSite)
	{
		::XTPFillFramePartRect(pDC, rc, pWnd, pSite, m_clrHeaderFace, TRUE);
	}

	void FillHeader(CDC* pDC, CRect rc, CXTPTabManager* pTabManager)
	{
		XTPFillFramePartRect(pDC, rc, (CXTPDockingPaneTabbedContainer*)pTabManager, ((CXTPDockingPaneTabbedContainer*)pTabManager)->GetDockingSite());
	}

	COLORREF FillPropertyButton(CDC* pDC, CRect rcItem, CXTPTabManagerItem* pItem)
	{
		if (m_bTransparentButton && (!m_bHighlightSelected || !pItem->IsSelected()))
			return COLORREF_NULL;

		if (m_bGradientButton)
			return CColorSetOffice2003::FillPropertyButton(pDC, rcItem, pItem);

		return CXTPTabPaintManagerColorSet::FillPropertyButton(pDC, rcItem, pItem);

	}
protected:
	BOOL m_bGradientButton;
	BOOL m_bTransparentButton;
	BOOL m_bHighlightSelected;

};

void CXTPDockingPaneVisualStudio2005Beta1Theme::CColorSetVisualStudio2005::RefreshMetrics()
{
	CXTPTabPaintManagerColorSet ::RefreshMetrics();

	if (m_bHighlightSelected)
	{
		m_clrButtonSelected.SetStandardValue(XTPColorManager()->LightColor(
			GetSysColor(COLOR_HIGHLIGHT), GetSysColor(COLOR_WINDOW), 0x02));

		m_clrSelectedText.SetStandardValue(GetSysColor(COLOR_WINDOWTEXT));
	}
	else
	{
		m_clrSelectedText.SetStandardValue(GetSysColor(COLOR_3DDKSHADOW));
	}
	m_clrHeaderFace.SetStandardValue(GetSysColor(COLOR_3DFACE), XTPColorManager()->LightColor(GetSysColor(COLOR_3DFACE), GetSysColor(COLOR_WINDOW), 0xcd));
	m_clrNormalText.SetStandardValue(GetSysColor(COLOR_3DDKSHADOW));

	m_bGradientButton = FALSE;
	m_bLunaTheme = FALSE;

	switch (XTPColorManager()->GetCurrentSystemTheme())
	{
	case xtpSystemThemeSilver:
		m_bGradientButton = TRUE;
		m_clrButtonNormal.SetStandardValue(RGB(242, 242, 247));

		m_csPropertyPage2003.clrBorderTopHighlight.SetStandardValue(RGB(255, 255, 255));
		m_csPropertyPage2003.clrDarkShadow.SetStandardValue(RGB(145, 155, 156));
		m_csPropertyPage2003.clrFrameBorder.SetStandardValue(RGB(145, 155, 156));
		m_csPropertyPage2003.clrBorderLeftHighlight.SetStandardValue(RGB(190, 190, 216));

		m_clrHeaderFace.SetStandardValue(RGB(215, 215, 229), RGB(243, 243, 247));
		break;

	case xtpSystemThemeBlue:
		m_bGradientButton = TRUE;
		m_csPropertyPage2003.clrBorderTopHighlight.SetStandardValue(RGB(255, 255, 255));

		m_clrHeaderFace.SetStandardValue(RGB(229, 229, 215), RGB(244, 241, 231));
		break;

	case xtpSystemThemeOlive:
		m_bGradientButton = TRUE;
		m_csPropertyPage2003.clrBorderTopHighlight.SetStandardValue(RGB(255, 255, 255));

		m_clrHeaderFace.SetStandardValue(RGB(229, 229, 215), RGB(244, 241, 231));
		break;
	}

	m_clrAutoHideFace.SetStandardValue(m_clrHeaderFace);
}

class CXTPDockingPaneVisualStudio2005Beta1Theme::CColorSetVisualStudio2003 : public CColorSetVisualStudio2005
{
public:
	CColorSetVisualStudio2003(BOOL bHighlightSelected)
		: CColorSetVisualStudio2005(bHighlightSelected)
	{
		m_bTransparentButton = TRUE;
	}

	void RefreshMetrics();
};

void CXTPDockingPaneVisualStudio2005Beta1Theme::CColorSetVisualStudio2003::RefreshMetrics()
{
	CColorSetVisualStudio2005::RefreshMetrics();

	m_bGradientButton = FALSE;
	m_bLunaTheme = FALSE;

	switch (XTPColorManager()->GetCurrentSystemTheme())
	{
	case xtpSystemThemeSilver:
	case xtpSystemThemeBlue:
	case xtpSystemThemeOlive:
		m_clrNormalText.SetStandardValue(RGB(113, 111, 100));
		if (!m_bHighlightSelected) m_clrSelectedText.SetStandardValue(RGB(113, 111, 100));
		break;
	}
}


CXTPDockingPaneVisualStudio2005Beta1Theme::CXTPDockingPaneVisualStudio2005Beta1Theme()
{
	CXTPTabPaintManager::CAppearanceSetPropertyPageFlat* pAppearanceFlat = (CXTPTabPaintManager::CAppearanceSetPropertyPageFlat*)
		m_pTabPaintManager->SetAppearance(xtpTabAppearancePropertyPageFlat);

	m_pTabPaintManager->m_bDisableLunaColors = TRUE;
	pAppearanceFlat->m_bBlurPoints = FALSE;
	m_pTabPaintManager->SetColorSet(new CColorSetVisualStudio2005(TRUE));
	m_pTabPaintManager->m_bHotTracking = FALSE;
	m_pTabPaintManager->m_clientFrame = xtpTabFrameNone;

	m_pPanelPaintManager->m_bDisableLunaColors = TRUE;
	pAppearanceFlat = (CXTPTabPaintManager::CAppearanceSetPropertyPageFlat*)m_pPanelPaintManager->SetAppearance(xtpTabAppearancePropertyPageFlat);
	pAppearanceFlat->m_bBlurPoints = FALSE;
	m_pPanelPaintManager->SetColorSet(new CColorSetVisualStudio2005(FALSE));
	m_pPanelPaintManager->m_bHotTracking = FALSE;
	m_pPanelPaintManager->SetLayout(xtpTabLayoutAutoSize);

	m_rcCaptionMargin.SetRect(0, 0, 0, 0);
	m_bGradientCaption = TRUE;
	m_bUseBoldCaptionFont = FALSE;
	m_dwSplitterStyle = xtpPaneSplitterGradient;

	m_systemTheme = xtpSystemThemeUnknown;
}

void CXTPDockingPaneVisualStudio2005Beta1Theme::RefreshMetrics()
{
	CXTPDockingPaneVisualStudio2003Theme::RefreshMetrics();

	m_clrNormalCaptionText.SetStandardValue(GetXtremeColor(COLOR_INACTIVECAPTIONTEXT));

	switch (XTPColorManager()->GetCurrentSystemTheme())
	{
	case xtpSystemThemeBlue:
		m_clrSplitterGradient.SetStandardValue(RGB(229, 229, 215), RGB(244, 241, 231));
		m_clrNormalCaption.SetStandardValue(RGB(216, 215, 198), RGB(238, 239, 229));
		m_clrNormalCaptionText.SetStandardValue(0);
		break;

	case xtpSystemThemeOlive:
		m_clrSplitterGradient.SetStandardValue(RGB(229, 229, 215), RGB(244, 241, 231));
		m_clrNormalCaption.SetStandardValue(RGB(216, 215, 198), RGB(238, 239, 229));
		m_clrNormalCaptionText.SetStandardValue(0);
		break;

	case xtpSystemThemeSilver:
		m_clrSplitterGradient.SetStandardValue(RGB(215, 215, 229), RGB(243, 243, 247));
		m_clrNormalCaption.SetStandardValue(RGB(224, 224, 235), RGB(242, 242, 246));
		m_clrActiveCaption.SetStandardValue(RGB(160, 158, 186), RGB(224, 225, 235));
		m_clrNormalCaptionText.SetStandardValue(0);
		break;
	}

}
CXTPDockingPaneVisualStudio2005Beta2Theme::CXTPDockingPaneVisualStudio2005Beta2Theme()
{
	m_pTabPaintManager->SetAppearance(xtpTabAppearanceVisualStudio2005);
	m_pTabPaintManager->SetColorSet(new CColorSetVisualStudio2005(TRUE));

	m_pPanelPaintManager->SetAppearance(xtpTabAppearanceVisualStudio2005);
	m_pPanelPaintManager->SetColorSet(new CColorSetVisualStudio2005(TRUE));
}

CXTPDockingPaneVisualStudio2005Theme::CXTPDockingPaneVisualStudio2005Theme()
{
	CXTPTabPaintManager::CAppearanceSetPropertyPageFlat* pAppearance =
		new CXTPTabPaintManager::CAppearanceSetPropertyPageFlat;
	pAppearance->m_bBlurPoints = FALSE;

	m_pPanelPaintManager->SetAppearanceSet(pAppearance);
	m_pPanelPaintManager->SetColorSet(new CColorSetVisualStudio2003(FALSE));
	m_pPanelPaintManager->m_bRotateImageOnVerticalDraw = TRUE;


	pAppearance = new CXTPTabPaintManager::CAppearanceSetPropertyPageFlat;
	pAppearance->m_bBlurPoints = FALSE;
	pAppearance->m_bVisualStudio2005Style = TRUE;

	m_pTabPaintManager->SetAppearanceSet(pAppearance);
	m_pTabPaintManager->SetColorSet(new CColorSetVisualStudio2003(TRUE));

	m_pTabPaintManager->m_clientFrame = xtpTabFrameSingleLine;
	m_pTabPaintManager->m_rcClientMargin.top = 1;

}



void CXTPDockingPaneVisualStudio2005Beta2Theme::RefreshMetrics()
{
	CXTPDockingPaneVisualStudio2005Beta1Theme::RefreshMetrics();

	m_clrNormalCaption.SetStandardValue(GetXtremeColor(COLOR_INACTIVECAPTION));
	m_clrActiveCaption.SetStandardValue(GetXtremeColor(COLOR_ACTIVECAPTION));
	m_clrCaptionBorder = GetXtremeColor(COLOR_3DSHADOW);

	switch (XTPColorManager()->GetCurrentSystemTheme())
	{
	case xtpSystemThemeBlue:
		m_clrNormalCaption.SetStandardValue(RGB(204, 199, 186));
		m_clrActiveCaption.SetStandardValue(RGB(59, 128, 237), RGB(49, 106, 197));
		m_clrNormalCaptionText.SetStandardValue(0);
		break;
	case xtpSystemThemeOlive:
		m_clrNormalCaption.SetStandardValue(RGB(204, 199, 186));
		m_clrActiveCaption.SetStandardValue(RGB(182, 195, 146), RGB(145, 160, 117));
		m_clrNormalCaptionText.SetStandardValue(0);
		break;
	case xtpSystemThemeSilver:
		m_clrNormalCaption.SetStandardValue(RGB(240, 240, 245));
		m_clrActiveCaption.SetStandardValue(RGB(211, 212, 221), RGB(166, 165, 191));
		m_clrNormalCaptionText.SetStandardValue(0);
		m_clrCaptionBorder = RGB(145, 155, 156);
		break;
	}
}

COLORREF CXTPDockingPaneVisualStudio2005Beta2Theme::FillCaptionPart(CDC* pDC, CXTPDockingPaneBase* pPane, CRect rcCaption, BOOL bActive, BOOL bVertical)
{
	XTPDrawHelpers()->GradientFill(pDC, rcCaption, bActive ? m_clrActiveCaption : m_clrNormalCaption, bVertical);

	if (pPane->GetType() == xtpPaneTypeSidePanel)
		return bActive ? m_clrActiveCaptionText : m_clrNormalCaptionText;

	CXTPPenDC pen(*pDC, m_clrCaptionBorder);
	if (bVertical)
	{
		pDC->MoveTo(rcCaption.right, rcCaption.bottom - 1);
		pDC->LineTo(rcCaption.left , rcCaption.bottom - 1);
		pDC->LineTo(rcCaption.left, rcCaption.top);
		pDC->LineTo(rcCaption.right, rcCaption.top);

	}
	else
	{
		pDC->MoveTo(rcCaption.left, rcCaption.bottom);
		pDC->LineTo(rcCaption.left , rcCaption.top);
		pDC->LineTo(rcCaption.right - 1, rcCaption.top);
		pDC->LineTo(rcCaption.right - 1, rcCaption.bottom - 1);
	}

	return bActive ? m_clrActiveCaptionText : m_clrNormalCaptionText;
}

//////////////////////////////////////////////////////////////////////////
// CXTPDockingPaneVisualStudio2008Theme

CXTPDockingPaneVisualStudio2008Theme::CXTPDockingPaneVisualStudio2008Theme()
{

}

void CXTPDockingPaneVisualStudio2008Theme::RefreshMetrics()
{
	CXTPDockingPaneVisualStudio2005Theme::RefreshMetrics();

	if (m_themeRebar->IsAppThemed())
	{
		m_pPanelPaintManager->SetAppearance(xtpTabAppearancePropertyPage);
		m_pPanelPaintManager->SetColor(xtpTabColorWinNative);
		m_pPanelPaintManager->m_bHotTracking = TRUE;

		m_pTabPaintManager->SetAppearance(xtpTabAppearancePropertyPage);
		m_pTabPaintManager->SetColor(xtpTabColorWinNative);
		m_pTabPaintManager->m_bHotTracking = TRUE;
	}
}

//////////////////////////////////////////////////////////////////////////
// CXTPDockingPaneVisualStudio2010Theme

CXTPDockingPaneVisualStudio2010Theme::CXTPDockingPaneVisualStudio2010Theme()
{
	m_nCaptionFontGap = 6;
	m_nCaptionButtonSize = 15;
	m_bAutoHidePanelHighlightSelected = FALSE;


	CXTPTabPaintManager::CAppearanceSetVisualStudio2010* pAppearance =
		new CXTPTabPaintManager::CAppearanceSetVisualStudio2010();
	pAppearance->m_rcHeaderMargin.left = 0;
	pAppearance->m_rcHeaderMargin.right = 0;

	m_pTabPaintManager->SetAppearanceSet(pAppearance);
	m_pTabPaintManager->SetColorSet(new CXTPTabPaintManager::CColorSetVisualStudio2010(TRUE));

	m_pTabPaintManager->m_clientFrame = xtpTabFrameSingleLine;
	m_pTabPaintManager->m_rcClientMargin.top = 1;


	pAppearance =
		new CXTPTabPaintManager::CAppearanceSetVisualStudio2010();
	pAppearance->m_bDrawNormalTab = TRUE;
	m_pPanelPaintManager->SetAppearanceSet(pAppearance);

	pAppearance->m_rcHeaderMargin.left = 0;
	m_pPanelPaintManager->SetColor(xtpTabColorVisualStudio2010);

	m_pTabPaintManager->m_bHotTracking = TRUE;
	m_pPanelPaintManager->m_bHotTracking = TRUE;
	m_nCaptionButtonStyle = xtpPaneCaptionButtonOffice2003;

}

void CXTPDockingPaneVisualStudio2010Theme::RefreshMetrics()
{
	CXTPDockingPaneVisualStudio2005Theme::RefreshMetrics();

	m_bLunaTheme = XTPSystemVersion()->IsWinVistaOrGreater();

	COLORREF clrBackground = m_pTabPaintManager->GetColorSet()->m_clrAutoHideFace;

	m_clrNormalCaption.SetStandardValue(RGB(77,96,130), RGB(61, 82, 119));
	m_clrActiveCaption.SetStandardValue(RGB(255, 232, 166));
	m_clrCaptionBorder = clrBackground;
	m_clrSplitter.SetStandardValue(clrBackground);
	m_clrSplitterGradient.SetStandardValue(clrBackground);

	m_clrNormalCaptionText.SetStandardValue(RGB(255, 255, 255));
	m_clrActiveCaptionText.SetStandardValue(0);

	if (!m_bLunaTheme)
	{
		m_clrNormalCaption.SetStandardValue(RGB(74, 97, 132));
		m_clrActiveCaption.SetStandardValue(RGB(255, 243, 206));
	}

	m_arrColor[XPCOLOR_3DFACE] = clrBackground;

	m_arrColor[XPCOLOR_HIGHLIGHT] = RGB(255, 255, 247);
	m_arrColor[XPCOLOR_HIGHLIGHT_BORDER] = RGB(231, 195, 99);
	m_arrColor[XPCOLOR_HIGHLIGHT_PUSHED] = RGB(255, 235, 165);
	m_arrColor[XPCOLOR_HIGHLIGHT_PUSHED_BORDER] = RGB(231, 195, 99);
	m_arrColor[XPCOLOR_PUSHED_TEXT] = RGB(0, 0, 0);
	m_arrColor[XPCOLOR_HIGHLIGHT_TEXT] = RGB(0, 0, 0);
}

void CXTPDockingPaneVisualStudio2010Theme::DrawFloatingFrame(CDC* pDC, CXTPDockingPaneMiniWnd* pPane, CRect rc)
{
	pDC->Draw3dRect(rc, m_clrCaptionBorder, m_clrCaptionBorder);
	rc.DeflateRect(1, 1);
	pDC->Draw3dRect(rc, m_clrCaptionBorder, m_clrCaptionBorder);
	rc.DeflateRect(1, 1);
	pDC->Draw3dRect(rc, m_clrCaptionBorder, m_clrCaptionBorder);

	int nTitleHeight = m_nTitleHeight;
	CRect rcCaption(rc);
	rcCaption.DeflateRect(0, 0, 0, rc.Height() - nTitleHeight - 3);

	CXTPBufferDC dcCache(*pDC, rcCaption);
	dcCache.SetBkMode(TRANSPARENT);

	dcCache.FillSolidRect(rcCaption, m_clrCaptionBorder);

	CString strTitle;
	pPane->GetWindowText(strTitle);

	rcCaption.DeflateRect(1, 2, 1, 0);

	BOOL bActive = m_bHighlightActiveCaption && pPane->IsActive();
	DrawCaptionPart(&dcCache, pPane, rcCaption, strTitle, bActive, FALSE);
}

COLORREF CXTPDockingPaneVisualStudio2010Theme::FillCaptionPart(CDC* pDC, CXTPDockingPaneBase* /*pPane*/, CRect rcCaption, BOOL bActive, BOOL bVertical)
{
	CXTPPaintManagerColorGradient& clr = bActive ? m_clrActiveCaption : m_clrNormalCaption;
	XTPDrawHelpers()->GradientFill(pDC, rcCaption, clr, bVertical);

	if (bActive)
	{
		CRect rTop(rcCaption);
		if (!bVertical) rTop.bottom = rTop.top + rTop.Height() / 2;
		else rTop.right = rTop.left + rTop.Width() / 2;

		XTPDrawHelpers()->GradientFill(pDC, rTop, RGB(255, 252, 242), RGB(255, 243, 207), bVertical);

	}

	if (!bVertical)
	{
		pDC->SetPixel(rcCaption.left, rcCaption.top, CXTPDrawHelpers::BlendColors(clr, m_clrCaptionBorder, (double)60 / 255));
		pDC->SetPixel(rcCaption.left + 1, rcCaption.top, CXTPDrawHelpers::BlendColors(clr, m_clrCaptionBorder, (double)120 / 255));
		pDC->SetPixel(rcCaption.left, rcCaption.top + 1, CXTPDrawHelpers::BlendColors(clr, m_clrCaptionBorder, (double)120 / 255));

		pDC->SetPixel(rcCaption.right - 1, rcCaption.top, CXTPDrawHelpers::BlendColors(clr, m_clrCaptionBorder, (double)60 / 255));
		pDC->SetPixel(rcCaption.right - 2, rcCaption.top, CXTPDrawHelpers::BlendColors(clr, m_clrCaptionBorder, (double)120 / 255));
		pDC->SetPixel(rcCaption.right - 1, rcCaption.top + 1, CXTPDrawHelpers::BlendColors(clr, m_clrCaptionBorder, (double)120 / 255));
	}

	return bActive ? RGB(115, 97, 57) : RGB(206, 215, 222);
}

void CXTPDockingPaneVisualStudio2010Theme::DrawCaptionButtonEntry(CDC* pDC, CXTPDockingPaneCaptionButton* pButton, CPoint pt, COLORREF clrButton)
{
	if (pButton->GetID() == XTP_IDS_DOCKINGPANE_AUTOHIDE)
	{
		CXTPPenDC pen(*pDC, clrButton);
		pt.y--;

		if (pButton->GetState() & xtpPanePinPushed)
		{
			pDC->MoveTo(pt.x - 5, pt.y); pDC->LineTo(pt.x - 1, pt.y);
			pDC->MoveTo(pt.x - 1, pt.y - 3); pDC->LineTo(pt.x - 1, pt.y + 4);
			pDC->MoveTo(pt.x - 1, pt.y + 2); pDC->LineTo(pt.x + 5, pt.y + 2);
			pDC->LineTo(pt.x + 5, pt.y - 2); pDC->LineTo(pt.x - 1, pt.y - 2);
			pDC->MoveTo(pt.x - 1, pt.y + 1); pDC->LineTo(pt.x + 5, pt.y + 1);
		}
		else
		{
			pt.y += 2;
			pDC->MoveTo(pt.x - 3, pt.y - 1 + 1); pDC->LineTo(pt.x + 4, pt.y - 1 + 1);
			pDC->MoveTo(pt.x, pt.y - 1 + 1); pDC->LineTo(pt.x, pt.y + 3 + 2);
			pDC->MoveTo(pt.x - 2, pt.y - 1 + 1); pDC->LineTo(pt.x - 2, pt.y - 6);
			pDC->LineTo(pt.x + 2, pt.y - 6); pDC->LineTo(pt.x + 2, pt.y - 1 + 1);
			pDC->MoveTo(pt.x + 1, pt.y - 1 + 1); pDC->LineTo(pt.x + 1, pt.y - 6);
		}
	}
	else
	{
		CXTPDockingPaneVisualStudio2008Theme::DrawCaptionButtonEntry(pDC, pButton, pt, clrButton);
	}

}