// XTPShortcutListBoxTheme.cpp: implementation of the CXTPShortcutListBoxTheme 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/XTPDrawHelpers.h"
#include "Common/XTPImageManager.h"
#include "Common/XTPColorManager.h"
#include "../Util/XTPControlTheme.h"


#include "XTPShortcutListBox.h"
#include "XTPShortcutListBoxTheme.h"

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

//===========================================================================
// CXTPShortcutListBoxTheme class
//===========================================================================

CXTPShortcutListBoxTheme::CXTPShortcutListBoxTheme()
{
}

CXTPShortcutListBoxTheme::~CXTPShortcutListBoxTheme()
{

}

void CXTPShortcutListBoxTheme::RefreshMetrics(CXTPShortcutListBox* /*pList*/)
{
	m_cxIcon = ::GetSystemMetrics(SM_CXICON);
	m_cyIcon = ::GetSystemMetrics(SM_CYICON);
	m_cyEdge = ::GetSystemMetrics(SM_CYEDGE)*2;

	// normal colors
	m_crgBack.SetStandardValue(GetXtremeColor(COLOR_3DSHADOW));
	m_crgItemBorder.SetStandardValue(GetXtremeColor(COLOR_3DDKSHADOW), GetXtremeColor(COLOR_3DHILIGHT));
	m_crItemText.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
	m_crItemTextDisabled.SetStandardValue(GetXtremeColor(COLOR_GRAYTEXT));

	// hot, pressed colors
	m_crgItemBackHot.SetStandardValue(COLORREF_NULL, COLORREF_NULL);
	m_crgItemBackPressed.SetStandardValue(COLORREF_NULL, COLORREF_NULL);
}

void CXTPShortcutListBoxTheme::DrawItem(CXTPShortcutListBox* pMenuListBox, LPDRAWITEMSTRUCT lpDIS)
{
	// Define temporary variables.
	CDC*  pDC = CDC::FromHandle (lpDIS->hDC);
	CRect rcIcon = lpDIS->rcItem;
	CRect rcText = lpDIS->rcItem;
	int   iItemID = lpDIS->itemID;

	// if empty, draw focus rect.
	if (iItemID < 0)
	{
		rcIcon.bottom = rcIcon.top + 15;
		pDC->DrawFocusRect(rcIcon);
		return;
	}

	// Get the menu item.
	CXTPShortcutListBox::CONTENT_ITEM* pCI = pMenuListBox->GetMenuItem(iItemID);
	ASSERT(pCI);
	if (!pCI)
		return;

	// set the text foreground and background colors.
	pDC->SetTextColor(GetTextColor());

	// repaint the background.
	pDC->SetBkMode(TRANSPARENT);

	long iMargin = (rcIcon.Width()-m_cxIcon)/2;

	rcIcon.top += m_cyEdge;
	rcIcon.left += iMargin;
	rcIcon.right = rcIcon.left + m_cxIcon;
	rcIcon.bottom = rcIcon.top + m_cyIcon;

	int iOffset = 0;

	BOOL bSelected = FALSE;
	BOOL bPressed = FALSE;

	if ((lpDIS->itemState & ODS_SELECTED) && pCI->m_bEnabled)
	{
		bSelected = TRUE;

		CRect rcBorder(rcIcon);
		rcBorder.InflateRect(2, 2);

		if (::GetKeyState(VK_LBUTTON) < 0)
		{
			if (!m_crgItemBackPressed.IsNull())
				XTPDrawHelpers()->GradientFill(pDC, rcBorder, m_crgItemBackPressed, FALSE);

			pDC->Draw3dRect(&rcBorder,
				m_crgItemBorder.clrLight, m_crgItemBorder.clrDark);

			iOffset = 1;
			bPressed = TRUE;
		}
		else
		{
			if (!m_crgItemBackHot.IsNull())
				XTPDrawHelpers()->GradientFill(pDC, rcBorder, m_crgItemBackHot, FALSE);

			pDC->Draw3dRect(&rcBorder,
				m_crgItemBorder.clrDark, m_crgItemBorder.clrLight);

			iOffset = -1;
		}
	}

	LOGFONT lf;
	pMenuListBox->GetFont()->GetLogFont(&lf);

	if (bSelected && !pMenuListBox->m_bNoUnderline)
		lf.lfUnderline = 1;

	// select the font used by the button text.
	CFont font;
	font.CreateFontIndirect(&lf);
	CXTPFontDC fnt(pDC, &font);

	// get the text height.
	int iTextHeight = pMenuListBox->GetTextHeight(pCI->m_strText);

	// define the text rect.
	rcText.top = rcText.bottom - (iTextHeight + m_cyEdge);
	rcText.left += m_cyEdge;
	rcText.right -= m_cyEdge;

	if ((pMenuListBox->m_bNoBorder) && (iOffset != 0))
	{
		rcIcon.OffsetRect(iOffset, iOffset);
		rcText.OffsetRect(iOffset, iOffset);
	}

	if (pCI->m_pIcon)
	{
		DrawImage(pDC, rcIcon, pCI->m_pIcon, pCI->m_bEnabled, bSelected, bPressed);
	}

	DrawText(pDC, rcText, pCI);
}

void CXTPShortcutListBoxTheme::DrawImage(CDC* pDC, CRect& rcIcon, CXTPImageManagerIcon* pImage, BOOL bEnabled, BOOL /*bSelected*/, BOOL /*bPressed*/)
{
	CPoint pt(rcIcon.TopLeft());

	if (bEnabled)
	{
		pImage->Draw(pDC, pt);
	}
	else
	{
		if (pImage->HasDisabledIcon() || pImage->IsAlpha())
		{
			pImage->Draw(pDC, pt, pImage->GetDisabledIcon());
		}
		else
		{
			pDC->DrawState(pt, rcIcon.Size(), pImage->GetIcon(), DST_ICON | DSS_DISABLED, (HBRUSH)NULL);
		}
	}
}

void CXTPShortcutListBoxTheme::DrawText(CDC* pDC, CRect& rcText, CXTPShortcutListBox::CONTENT_ITEM* pCI)
{
	if (!pCI->m_bEnabled)
	{
		CRect rc = rcText;
		rc.OffsetRect(1, 1);

		pDC->SetTextColor(GetXtremeColor(COLOR_WINDOW));
		pDC->DrawText(pCI->m_strText, rc,
			DT_CENTER | DT_TOP | DT_END_ELLIPSIS);

		pDC->SetTextColor(GetXtremeColor(COLOR_3DSHADOW));
	}

	pDC->DrawText(pCI->m_strText, rcText,
		DT_CENTER | DT_TOP | DT_END_ELLIPSIS);
}

COLORREF CXTPShortcutListBoxTheme::GetBackColor()
{
	return m_crgBack;
}

COLORREF CXTPShortcutListBoxTheme::GetTextColor()
{
	return m_crItemText;
}

//////////////////////////////////////////////////////////////////////////
// CXTPShortcutListBoxThemeOfficeXP

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

void CXTPShortcutListBoxThemeOfficeXP::RefreshMetrics(CXTPShortcutListBox* pList)
{
	CXTPShortcutListBoxTheme::RefreshMetrics(pList);

	// normal colors
	m_crgBack.SetStandardValue(GetXtremeColor(XPCOLOR_TOOLBAR_FACE));
	m_crItemText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
	m_crgItemBorder.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER), GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER));
	m_crItemTextDisabled.SetStandardValue(GetXtremeColor(XPCOLOR_GRAYTEXT));

	// hot, pressed colors
	m_crgItemBackHot.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT), GetXtremeColor(XPCOLOR_HIGHLIGHT));
	m_crgItemBackPressed.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT_PUSHED), GetXtremeColor(XPCOLOR_HIGHLIGHT_PUSHED));
}

void CXTPShortcutListBoxThemeOfficeXP::DrawImage(CDC* pDC, CRect& rcIcon, CXTPImageManagerIcon* pImage, BOOL bEnabled, BOOL bSelected, BOOL bPressed)
{
	ASSERT(pImage);
	if (!pImage)
		return;
	CPoint pt(rcIcon.TopLeft());

	if (bEnabled)
	{
		if (!bSelected && !bPressed)
		{
			pImage->Draw(pDC, pt, pImage->GetFadedIcon());
		}
		else if (bSelected && !bPressed)
		{
			pImage->Draw(pDC, CPoint(pt.x + 1, pt.y + 1), pImage->GetShadowIcon());
			pImage->Draw(pDC, CPoint(pt.x - 1, pt.y - 1), pImage->GetHotIcon());
		}
		else
		{
			pImage->Draw(pDC, rcIcon.TopLeft());
		}
	}
	else
	{
		if (pImage->HasDisabledIcon() || pImage->IsAlpha())
		{
			pImage->Draw(pDC, pt, pImage->GetDisabledIcon());
		}
		else
		{
			pImage->DrawMono(pDC, pt, pImage->GetIcon(), 0, m_crItemTextDisabled);
		}
	}
}

void CXTPShortcutListBoxThemeOfficeXP::DrawText(CDC* pDC, CRect& rcText, CXTPShortcutListBox::CONTENT_ITEM* pCI)
{
	pDC->SetTextColor(pCI->m_bEnabled ? m_crItemText : m_crItemTextDisabled);
	pDC->DrawText(pCI->m_strText, rcText, DT_CENTER | DT_TOP | DT_END_ELLIPSIS);
}

//////////////////////////////////////////////////////////////////////////
//  CXTPShortcutListBoxThemeOffice2003

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

void CXTPShortcutListBoxThemeOffice2003::RefreshMetrics(CXTPShortcutListBox* pList)
{
	CXTPShortcutListBoxThemeOfficeXP::RefreshMetrics(pList);

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

		switch (systemTheme)
		{
		case xtpSystemThemeBlue:
		case xtpSystemThemeRoyale:
		case xtpSystemThemeAero:
			// normal colors
			m_crgBack.SetStandardValue(RGB(0xdd, 0xec, 0xfe), RGB(0x4a, 0x7a, 0xc9));
			m_crgItemBorder.SetStandardValue(RGB(0x00, 0x00, 0x80), RGB(0x00, 0x00, 0x80));
			m_crItemText.SetStandardValue(RGB(0x00, 0x00, 0x00));
			m_crItemTextDisabled.SetStandardValue(RGB(0x6d, 0x96, 0xd0));

			// hot, pressed colors
			m_crgItemBackHot.SetStandardValue(RGB(0xff, 0xf0, 0xc5), RGB(0xff, 0xd6, 0x9b));
			m_crgItemBackPressed.SetStandardValue(RGB(0xfe, 0x90, 0x4d), RGB(0xfe, 0xc9, 0x85));
			break;

		case xtpSystemThemeOlive:
			// normal colors
			m_crgBack.SetStandardValue(RGB(0xf3, 0xf2, 0xe7), RGB(0x9f, 0xab, 0x80));
			m_crgItemBorder.SetStandardValue(RGB(0x3f, 0x5d, 0x38), RGB(0x3f, 0x5d, 0x38));
			m_crItemText.SetStandardValue(RGB(0x00, 0x00, 0x00));
			m_crItemTextDisabled.SetStandardValue(RGB(0x9f, 0xae, 0x7a));

			// hot, pressed colors
			m_crgItemBackHot.SetStandardValue(RGB(0xff, 0xf0, 0xc5), RGB(0xff, 0xd6, 0x9b));
			m_crgItemBackPressed.SetStandardValue(RGB(0xfe, 0x90, 0x4d), RGB(0xfe, 0xc9, 0x85));
			break;

		case xtpSystemThemeSilver:
			// normal colors
			m_crgBack.SetStandardValue(RGB(0xee, 0xee, 0xf4), RGB(0xa2, 0xa2, 0xb5));
			m_crgItemBorder.SetStandardValue(RGB(0x4b, 0x4b, 0x6f), RGB(0x4b, 0x4b, 0x6f));
			m_crItemText.SetStandardValue(RGB(0x00, 0x00, 0x00));
			m_crItemTextDisabled.SetStandardValue(RGB(0xa8, 0xa7, 0xbe));

			// hot, pressed colors
			m_crgItemBackHot.SetStandardValue(RGB(0xff, 0xf0, 0xc5), RGB(0xff, 0xd6, 0x9b));
			m_crgItemBackPressed.SetStandardValue(RGB(0xfe, 0x90, 0x4d), RGB(0xfe, 0xc9, 0x85));
			break;

		default:
			// normal colors
			m_crgBack.SetStandardValue(XTPColorManager()->LightColor(GetXtremeColor(COLOR_3DFACE),
				GetXtremeColor(COLOR_WINDOW), 0xcd), GetXtremeColor(COLOR_3DFACE));
			break;
		}
	}
}

void CXTPShortcutListBoxThemeOffice2003::DrawImage(CDC* pDC, CRect& rcIcon, CXTPImageManagerIcon* pImage, BOOL bEnabled, BOOL /*bSelected*/, BOOL /*bPressed*/)
{
	CPoint pt(rcIcon.TopLeft());

	if (bEnabled)
	{
		pImage->Draw(pDC, pt);
	}
	else
	{
		if (pImage->HasDisabledIcon() || pImage->IsAlpha())
		{
			pImage->Draw(pDC, pt, pImage->GetDisabledIcon());
		}
		else
		{
			pImage->DrawMono(pDC, pt, pImage->GetIcon(), 0, m_crItemTextDisabled);
		}
	}
}