// HMHeaderCtrl.cpp : implementation file
//

#include "stdafx.h"
#include "HMHeaderCtrl.h"

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

/////////////////////////////////////////////////////////////////////////////
// CHMHeaderCtrl

CHMHeaderCtrl::CHMHeaderCtrl()
{
	m_iLastColumn = -1;
}

CHMHeaderCtrl::~CHMHeaderCtrl()
{
	m_up.DeleteObject();
	m_down.DeleteObject();
}

inline HBITMAP CHMHeaderCtrl::GetArrowBitmap(bool bAscending)
{
	if( bAscending )
	{
		if( ! m_up.GetSafeHandle() )
		{
			CreateUpArrowBitmap();
		}
		return (HBITMAP)m_up.GetSafeHandle();
	}
	else
	{
		if( ! m_down.GetSafeHandle() )
		{
			CreateDownArrowBitmap();
		}
		return (HBITMAP)m_down.GetSafeHandle();
	}

	return NULL;
}

inline void CHMHeaderCtrl::CreateUpArrowBitmap()
{
	CDC MemDC;
	CClientDC dc(this);
	CRect r(0,0,8,8);

	// create offscreen dc and offscreen bitmap
	MemDC.CreateCompatibleDC(&dc);

	m_up.CreateCompatibleBitmap(&dc,r.Width(),r.Height());

	CBitmap* pOldBitmap = MemDC.SelectObject(&m_up);

	// Draw the background
	MemDC.FillSolidRect(r, ::GetSysColor(COLOR_3DFACE));

	// Set up pens to use for drawing the triangle
	CPen penLight(PS_SOLID, 1, GetSysColor(COLOR_3DHILIGHT));
	CPen penShadow(PS_SOLID, 1, GetSysColor(COLOR_3DSHADOW));
	CPen *pOldPen = MemDC.SelectObject( &penLight );

	// Draw triangle pointing upwards
	MemDC.MoveTo( r.left,		r.bottom-1 );
	MemDC.LineTo( r.right,	r.bottom-1 );
	MemDC.LineTo( r.right/2,	r.top );

	MemDC.SelectObject( &penShadow );
	MemDC.LineTo( r.left, r.bottom-1 );

	// clean up
	MemDC.SelectObject(pOldPen);
	MemDC.SelectObject(pOldBitmap);
}

inline void CHMHeaderCtrl::CreateDownArrowBitmap()
{
	CDC MemDC;
	CClientDC dc(this);
	CRect r(0,0,8,8);

	// create offscreen dc and offscreen bitmap
	MemDC.CreateCompatibleDC(&dc);

	m_down.CreateCompatibleBitmap(&dc,r.Width(),r.Height());

	CBitmap* pOldBitmap = MemDC.SelectObject(&m_down);

	// Draw the background
	MemDC.FillSolidRect(r, ::GetSysColor(COLOR_3DFACE));

	// Set up pens to use for drawing the triangle
	CPen penLight(PS_SOLID, 1, GetSysColor(COLOR_3DHILIGHT));
	CPen penShadow(PS_SOLID, 1, GetSysColor(COLOR_3DSHADOW));
	CPen *pOldPen = MemDC.SelectObject( &penShadow );

	// Draw triangle pointing downwards
	MemDC.MoveTo( r.right,		r.top );
	MemDC.LineTo( r.left,			r.top );
	MemDC.LineTo( r.right/2,	r.bottom );

	MemDC.SelectObject( &penLight );
	MemDC.LineTo( r.right, r.top );

	// clean up
	MemDC.SelectObject(pOldPen);
	MemDC.SelectObject(pOldBitmap);
}

int CHMHeaderCtrl::SetSortImage( int nColumn, bool bAscending )
{
	int nPrevCol = m_iLastColumn;
	m_bSortAscending = bAscending;

	// set the passed column to display the appropriate sort indicator
	HDITEM hditem;
	hditem.mask = HDI_FORMAT;
	GetItem( nColumn, &hditem );
	hditem.mask = HDI_BITMAP | HDI_FORMAT;
	hditem.fmt |= HDF_BITMAP;
	hditem.fmt |= HDF_BITMAP_ON_RIGHT;
	hditem.hbm = (HBITMAP)GetArrowBitmap(bAscending);
	SetItem( nColumn, &hditem );

	// save off the last column the user clikced on
	m_iLastColumn = nColumn;

	return nPrevCol;
}

void CHMHeaderCtrl::RemoveSortImage(int nColumn)
{
	// clear the sort indicator from the previous column
	HDITEM hditem;
	hditem.mask = HDI_FORMAT;
	GetItem( nColumn, &hditem );
	hditem.mask = HDI_FORMAT;
	hditem.fmt &= ~HDF_BITMAP;
	hditem.fmt &= ~HDF_BITMAP_ON_RIGHT;
	SetItem( nColumn, &hditem );
}

void CHMHeaderCtrl::RemoveAllSortImages()
{
	int iCount = GetItemCount();
	for( int i = 0; i < iCount; i++ )
	{
		RemoveSortImage(i);
	}
}


BEGIN_MESSAGE_MAP(CHMHeaderCtrl, CHeaderCtrl)
	//{{AFX_MSG_MAP(CHMHeaderCtrl)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CHMHeaderCtrl message handlers



