// XTPSplitterWndTheme.cpp: implementation of the XTPSplitterWndTheme class.
//
// This file is a part of the XTREME CONTROLS 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 "Common/XTPColorManager.h"
#include "Common/XTPResourceImage.h"
#include "Common/XTPSystemHelpers.h"
#include "Common/XTPDrawHelpers.h"

#include "../Util/XTPControlTheme.h"
#include "XTPSplitterWnd.h"
#include "XTPSplitterWndTheme.h"

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

enum ESplitType { splitBox, splitBar, splitIntersection, splitBorder };

/////////////////////////////////////////////////////////////////////////////
// CXTPSplitterWndTheme

CXTPSplitterWndTheme::CXTPSplitterWndTheme()
: m_bTabColors(FALSE)
{
}

void CXTPSplitterWndTheme::RefreshMetrics()
{
	// set splitter colors.
	m_crBack.SetStandardValue(::GetSysColor(COLOR_3DFACE));
	m_crOuterBorder.SetStandardValue(::GetSysColor(COLOR_3DHILIGHT), ::GetSysColor(COLOR_3DSHADOW));
	m_crInnerBorder.SetStandardValue(::GetSysColor(COLOR_3DFACE), ::GetSysColor(COLOR_WINDOWFRAME));

	// set split box colors.
	m_crBoxBack = m_crBack;
	m_crOuterBoxBorder = m_crOuterBorder;
	m_crInnerBoxBorder = m_crInnerBorder;
}

void CXTPSplitterWndTheme::DrawSplitter(CDC* pDC, CXTPSplitterWnd* pSplitter, int nType, const CRect& rectArg)
{
	CRect rect = rectArg;

	// draw the borders.
	switch (nType)
	{
	case splitBorder:
		pDC->Draw3dRect(rect, pSplitter->IsBorderVisible() ? m_crOuterBorder.clrDark : m_crBack, pSplitter->IsBorderVisible() ? m_crOuterBorder.clrLight : m_crBack);
		rect.InflateRect(-CX_BORDER, -CY_BORDER);
		pDC->Draw3dRect(rect, pSplitter->IsBorderVisible() ? m_crInnerBorder.clrDark : m_crBack, pSplitter->IsBorderVisible() ? m_crInnerBorder.clrLight : m_crBack);
		return;

	case splitIntersection:
		ASSERT(!XTPSystemVersion()->IsWin95OrGreater());
		break;

	case splitBox:
		pDC->Draw3dRect(rect, m_crOuterBoxBorder.clrLight, m_crOuterBoxBorder.clrDark);
		rect.InflateRect(-CX_BORDER, -CY_BORDER);
		pDC->Draw3dRect(rect, m_crInnerBoxBorder.clrLight, m_crInnerBoxBorder.clrDark);
		rect.InflateRect(-CX_BORDER, -CY_BORDER);
		pDC->FillSolidRect(&rect, m_crBoxBack.clrDark);
		return;

	case splitBar:
		break;

	default:
		ASSERT(FALSE);  // unknown splitter type
	}

	// fill the background.
	pDC->FillSolidRect(&rect, m_crBack.clrDark);
}

void CXTPSplitterWndTheme::EnableTabColors(BOOL bEnable /*=TRUE*/)
{
	m_bTabColors = bEnable;
	RefreshMetrics();
}

CBrush* CXTPSplitterWndTheme::GetTrackBrush()
{
	return CDC::GetHalftoneBrush();
}

/////////////////////////////////////////////////////////////////////////////
// CXTPSplitterWndThemeOfficeXP

CXTPSplitterWndThemeOfficeXP::CXTPSplitterWndThemeOfficeXP()
{
	m_nTheme = xtpControlThemeOfficeXP;
}

void CXTPSplitterWndThemeOfficeXP::RefreshMetrics()
{
	// set splitter colors.
	m_crBack.SetStandardValue(::GetSysColor(COLOR_3DFACE));
	m_crOuterBorder.SetStandardValue(::GetSysColor(COLOR_3DFACE));
	m_crInnerBorder.SetStandardValue(::GetSysColor(COLOR_3DHILIGHT), ::GetSysColor(COLOR_3DSHADOW));

	// set split box colors.
	m_crBoxBack = m_crBack;
	m_crOuterBoxBorder.SetStandardValue(::GetSysColor(COLOR_3DHILIGHT), ::GetSysColor(COLOR_3DSHADOW));
	m_crInnerBoxBorder.SetStandardValue(::GetSysColor(COLOR_3DFACE));
}

CBrush* CXTPSplitterWndThemeOfficeXP::GetTrackBrush()
{
	return CBrush::FromHandle((HBRUSH)::GetStockObject(WHITE_BRUSH));
}

/////////////////////////////////////////////////////////////////////////////
// CXTPSplitterWndThemeOffice2003

CXTPSplitterWndThemeOffice2003::CXTPSplitterWndThemeOffice2003()
{
	m_nTheme = xtpControlThemeOffice2003;
}

void CXTPSplitterWndThemeOffice2003::RefreshMetrics()
{
	CXTPSplitterWndThemeOfficeXP::RefreshMetrics();

	// set splitter colors.
	if (!XTPColorManager()->IsLunaColorsDisabled())
	{
		XTPCurrentSystemTheme systemTheme = XTPColorManager()->GetCurrentSystemTheme();

		switch (systemTheme)
		{
		case xtpSystemThemeBlue:
		case xtpSystemThemeRoyale:
		case xtpSystemThemeAero:
			m_crBack.SetStandardValue(RGB(165, 195, 255));
			m_crOuterBorder.SetStandardValue(RGB(165, 195, 255));
			m_crInnerBorder.SetStandardValue(RGB(0, 44, 148));
			break;

		case xtpSystemThemeOlive:
			m_crBack.SetStandardValue(RGB(226, 231, 191));
			m_crOuterBorder.SetStandardValue(RGB(226, 231, 191));
			m_crInnerBorder.SetStandardValue(RGB(99, 130, 90));
			break;

		case xtpSystemThemeSilver:
			m_crBack.SetStandardValue(RGB(223, 223, 234));
			m_crOuterBorder.SetStandardValue(RGB(223, 223, 234));
			m_crInnerBorder.SetStandardValue(RGB(123, 125, 148));
			break;
		}
	}

	// set split box colors.
	m_crBoxBack = m_crBack;
	m_crOuterBoxBorder = m_crOuterBorder;
	m_crInnerBoxBorder = m_crInnerBorder;
}

void CXTPSplitterWndThemeOffice2003::DrawSplitter(CDC* pDC, CXTPSplitterWnd* pSplitter, int nType, const CRect& rectArg)
{
	if (nType == splitBox)
	{
		// fill the background.
		CRect rect = rectArg;
		pDC->FillSolidRect(&rect, m_crBoxBack.clrDark);

		CXTPPenDC pen(*pDC, m_crInnerBorder.clrDark);

		if (rect.Width() > rect.Height())
		{
			// vSplitterBox
			pDC->MoveTo(rect.left,rect.top);
			pDC->LineTo(rect.left,rect.bottom-1);
			pDC->LineTo(rect.right,rect.bottom-1);
		}
		else
		{
			// hSplitterBox
			pDC->MoveTo(rect.left,rect.top);
			pDC->LineTo(rect.right-1,rect.top);
			pDC->LineTo(rect.right-1,rect.bottom);
		}
	}
	else
	{
		CXTPSplitterWndThemeOfficeXP::DrawSplitter(pDC, pSplitter, nType, rectArg);
	}
}

/////////////////////////////////////////////////////////////////////////////
// CXTPSplitterWndThemeResource

CXTPSplitterWndThemeResource::CXTPSplitterWndThemeResource()
{
	m_nTheme = xtpControlThemeResource;
}

void CXTPSplitterWndThemeResource::RefreshMetrics()
{
	CXTPResourceImages* pImages = XTPResourceImages();
	if (pImages)
	{
		// get colors from resource.
		COLORREF crBack = pImages->GetImageColor(_T("Window"), m_bTabColors ? _T("SplitterFaceTab") : _T("SplitterFace"), GetXtremeColor(COLOR_3DFACE));
		COLORREF crBorder = pImages->GetImageColor(_T("Window"), m_bTabColors ? _T("SplitterFrameTab") : _T("SplitterFrame"), GetXtremeColor(COLOR_3DSHADOW));

		// set splitter colors.
		m_crBack.SetStandardValue(crBack);
		m_crOuterBorder.SetStandardValue(crBack);
		m_crInnerBorder.SetStandardValue(crBorder);

		// set split box colors.
		m_crBoxBack = m_crBack;
		m_crOuterBoxBorder = m_crOuterBorder;
		m_crInnerBoxBorder = m_crInnerBorder;
	}
	else
	{
		CXTPSplitterWndThemeOfficeXP::RefreshMetrics();
	}
}

/////////////////////////////////////////////////////////////////////////////
// CXTPSplitterWndThemeVisualStudio2010

CXTPSplitterWndThemeVisualStudio2010::CXTPSplitterWndThemeVisualStudio2010()
{
	m_nTheme = xtpControlThemeVisualStudio2010;
}

void CXTPSplitterWndThemeVisualStudio2010::RefreshMetrics()
{
	// set splitter colors.
	m_crBack.SetStandardValue(m_bTabColors ? RGB(255, 243, 206) : RGB(173, 186, 206));
	m_crOuterBorder.SetStandardValue(m_bTabColors ? RGB(255, 243, 206) : RGB(173, 186, 206));
	m_crInnerBorder.SetStandardValue(m_bTabColors ? RGB(255, 243, 206) : RGB(132, 146, 165));

	// set split box colors.
	m_crBoxBack.SetStandardValue(RGB(208, 215, 226));
	m_crOuterBoxBorder.SetStandardValue(m_bTabColors ? RGB(155, 167, 183) : RGB(208, 215, 226));
	m_crInnerBoxBorder.SetStandardValue(RGB(208, 215, 226));
}

void CXTPSplitterWndThemeVisualStudio2010::DrawSplitter(CDC* pDC, CXTPSplitterWnd* pSplitter, int nType, const CRect& rectArg)
{
	if (m_bTabColors)
	{
		CXTPSplitterWndThemeOfficeXP::DrawSplitter(pDC, pSplitter, nType, rectArg);
	}
	else
	{
		CXTPSplitterWndThemeOffice2003::DrawSplitter(pDC, pSplitter, nType, rectArg);
	}
}