// XTOutBarCtrlTheme.cpp: implementation of the CXTOutBarCtrlTheme 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/XTPDrawHelpers.h"
#include "Common/XTPMaskEditT.h"


#include "../Defines.h"
#include "../Util/XTPControlTheme.h"
#include "../Edit/XTPEdit.h"

#include "XTThemeManager.h"
#include "XTVC50Helpers.h"
#include "XTOutBarCtrl.h"
#include "XTOutBarCtrlTheme.h"

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

IMPLEMENT_THEME_FACTORY(CXTOutBarCtrlTheme)

//===========================================================================
// CXTOutBarCtrlTheme class
//===========================================================================

CXTOutBarCtrlTheme::CXTOutBarCtrlTheme()
{
	m_bFlatIcon = FALSE;
	m_bPlainText = FALSE;
}

CXTOutBarCtrlTheme::~CXTOutBarCtrlTheme()
{

}

void CXTOutBarCtrlTheme::RefreshMetrics()
{
	CXTThemeManagerStyle ::RefreshMetrics();

	m_clrBack.SetStandardValue(GetXtremeColor(COLOR_3DSHADOW));
	m_clrText.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
}


void CXTOutBarCtrlTheme::DrawItemIcon(CDC* pDC, CPoint pt, CXTOutBarItem* pBarItem, CImageList* pImageList)
{
	int nIndex = pBarItem->GetIndex();

	if (pBarItem->IsEnabled())
	{
		pImageList->Draw(pDC, nIndex, pt, ILD_NORMAL);
	}
	else
	{
		HICON hIcon = pImageList->ExtractIcon(nIndex);

		if (m_bFlatIcon)
		{
			CBrush brush(GetXtremeColor(COLOR_3DSHADOW));
			pDC->DrawState(pt, CSize(0, 0), hIcon,
				DST_ICON | DSS_MONO, (HBRUSH)brush);
		}
		else
		{
			pDC->DrawState(pt, CSize(0, 0), hIcon,
				DSS_DISABLED | DST_ICON, (HBRUSH)NULL);
		}
		DestroyIcon(hIcon);
	}
}

void CXTOutBarCtrlTheme::DrawItemText(CDC* pDC, CRect rc, CXTOutBarItem* pBarItem, UINT nFormat)
{
	CString strText = pBarItem->GetName();

	if (pBarItem->IsEnabled())
	{
		pDC->DrawText(strText, rc, nFormat);
	}
	else
	{
		if (m_bPlainText)
		{
			pDC->SetTextColor(GetXtremeColor(COLOR_3DSHADOW));
			pDC->DrawText(strText, rc, nFormat);
		}
		else
		{
			rc.OffsetRect(1, 1);
			pDC->SetTextColor(GetXtremeColor(COLOR_WINDOW));
			pDC->DrawText(strText, rc, nFormat);

			rc.OffsetRect(-1, -1);
			pDC->SetTextColor(GetXtremeColor(COLOR_3DSHADOW));
			pDC->DrawText(strText, rc, nFormat);
		}
	}
}

void CXTOutBarCtrlTheme::DrawFolder(CDC* pDC, CRect rect, CXTOutBarFolder* pBarFolder, const XTMouseState eHilight)
{
	CRect rcFolder(rect);

	CXTPFontDC fnt(pDC, pBarFolder->GetControl()->GetFontX());
	pDC->SetBkMode(TRANSPARENT);
	pDC->SetTextColor(GetXtremeColor(COLOR_BTNTEXT));

	pDC->FillSolidRect(rect, GetXtremeColor(COLOR_3DFACE));

	switch (eHilight)
	{
	case xtMouseNormal:
		pDC->Draw3dRect(rect, GetXtremeColor(COLOR_3DHILIGHT), GetXtremeColor(COLOR_3DSHADOW));
		break;

	case xtMouseSelect:
		pDC->Draw3dRect(rect, GetXtremeColor(COLOR_3DDKSHADOW), GetXtremeColor(COLOR_3DFACE));
		rect.InflateRect(-1, -1);
		pDC->Draw3dRect(rect, GetXtremeColor(COLOR_3DSHADOW), GetXtremeColor(COLOR_3DHILIGHT));
		break;

	case xtMouseHover:
		pDC->Draw3dRect(rect, GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_3DDKSHADOW));
		rect.InflateRect(-1, -1);
		pDC->Draw3dRect(rect, GetXtremeColor(COLOR_3DHILIGHT), GetXtremeColor(COLOR_3DSHADOW));
		break;
	}

	rcFolder.DeflateRect(4, 0);

	pDC->DrawText(pBarFolder->GetName(), rcFolder,
		DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS);

}

void CXTOutBarCtrlTheme::FillInsideRect(CDC* pDC, CRect rc)
{
	pDC->FillSolidRect(rc, m_clrBack);
}


void CXTOutBarCtrlTheme::DrawIconFrame(CDC* pDC, CRect rcIcon, BOOL bSelected, BOOL bPressed)
{
	if (!bSelected)
	{
		if (bPressed)
			pDC->Draw3dRect(rcIcon, GetXtremeColor(COLOR_WINDOWFRAME), GetXtremeColor(COLOR_3DFACE));
		else
			pDC->Draw3dRect(rcIcon, GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOWFRAME));
	}
	else
	{
		pDC->Draw3dRect(rcIcon, GetXtremeColor(COLOR_WINDOWFRAME), GetXtremeColor(COLOR_3DFACE));

	}
}

//////////////////////////////////////////////////////////////////////////
// CXTOutBarCtrlThemeOfficeXP

CXTOutBarCtrlThemeOfficeXP::CXTOutBarCtrlThemeOfficeXP()
{
	m_bFlatIcon = TRUE;
	m_bPlainText = TRUE;
}

void CXTOutBarCtrlThemeOfficeXP::RefreshMetrics()
{
	CXTOutBarCtrlTheme::RefreshMetrics();

	m_clrBack.SetStandardValue(GetXtremeColor(XPCOLOR_TOOLBAR_FACE));
	m_clrText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
}

void CXTOutBarCtrlThemeOfficeXP::DrawIconFrame(CDC* pDC, CRect rcIcon, BOOL bSelected, BOOL bPressed)
{
	if (!bSelected)
	{
		pDC->FillSolidRect(rcIcon, GetXtremeColor(bPressed ? XPCOLOR_HIGHLIGHT_PUSHED : XPCOLOR_HIGHLIGHT));
		pDC->Draw3dRect(rcIcon, GetXtremeColor(COLOR_HIGHLIGHT), GetXtremeColor(COLOR_HIGHLIGHT));
	}
	else
	{
		pDC->Draw3dRect(rcIcon, GetXtremeColor(COLOR_HIGHLIGHT), GetXtremeColor(COLOR_HIGHLIGHT));
	}
}

//////////////////////////////////////////////////////////////////////////
//
CXTOutBarCtrlThemeOffice2003::CXTOutBarCtrlThemeOffice2003()
{
	RefreshMetrics();
}

void CXTOutBarCtrlThemeOffice2003::RefreshMetrics()
{
	CXTOutBarCtrlThemeOfficeXP::RefreshMetrics();

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

	m_bLunaTheme = FALSE;

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

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

		if (systemTheme != xtpSystemThemeUnknown)
		{
			m_grcSelected.SetStandardValue(RGB(251, 230, 148), RGB(238, 149, 21));
			m_grcPushed.SetStandardValue(RGB(232, 127, 8), RGB(247, 218, 124));
			m_grcHot.SetStandardValue(RGB(255, 255, 220), RGB(247, 192, 91));
			m_bLunaTheme = TRUE;
		}
	}
}

void CXTOutBarCtrlThemeOffice2003::DrawFolder(CDC* pDC, CRect rect, CXTOutBarFolder* pBarFolder, const XTMouseState eHilight)
{
	CRect rcFolder(rect);

	CXTPFontDC fnt(pDC, pBarFolder->GetControl()->GetFontX());
	pDC->SetBkMode(TRANSPARENT);
	pDC->SetTextColor(GetXtremeColor(COLOR_BTNTEXT));

	switch (eHilight)
	{
	case xtMouseNormal:
		XTPDrawHelpers()->GradientFill(pDC, rect, XTPColorManager()->grcDockBar.clrDark, XTPColorManager()->grcDockBar.clrLight, FALSE);
		break;

	case xtMouseSelect:
		XTPDrawHelpers()->GradientFill(pDC, rect, m_grcPushed, FALSE);
		break;

	case xtMouseHover:
		XTPDrawHelpers()->GradientFill(pDC, rect, m_grcSelected, FALSE);
		break;
	}
	pDC->Draw3dRect(rect, GetXtremeColor(COLOR_3DHILIGHT), GetXtremeColor(XPCOLOR_FRAME));

	rcFolder.DeflateRect(4, 0);

	pDC->DrawText(pBarFolder->GetName(), rcFolder,
		DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS);

}

void CXTOutBarCtrlThemeOffice2003::DrawIconFrame(CDC* pDC, CRect rcIcon, BOOL bSelected, BOOL bPressed)
{
	if (!m_bLunaTheme)
	{
		CXTOutBarCtrlThemeOfficeXP::DrawIconFrame(pDC, rcIcon, bSelected, bPressed);
		return;
	}

	if (!bSelected)
	{
		if (bPressed)
			XTPDrawHelpers()->GradientFill(pDC, rcIcon, m_grcPushed, FALSE);
		else
			XTPDrawHelpers()->GradientFill(pDC, rcIcon, m_grcHot, FALSE);
	}
	else
	{
		XTPDrawHelpers()->GradientFill(pDC, rcIcon, m_grcSelected, FALSE);

	}
	pDC->Draw3dRect(rcIcon, GetXtremeColor(XPCOLOR_FRAME), GetXtremeColor(XPCOLOR_FRAME));
}