// EIKHLBI.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <eikhlbi.h>
#include <eikhlbm.h>
#include <eikdutil.h>
#include <eiklbx.pan>
#include <eikenv.h>
const TInt KBitmapGutter=5;

EXPORT_C CHierarchicalListItemDrawer::CHierarchicalListItemDrawer(CHierarchicalListBoxModel* aModel,
																  const CFont* aFont,
																  CArrayPtr<CFbsBitmap>* aBitmaps)
	: iModel(aModel), iFont(aFont), iBitmaps(aBitmaps)
	{}

EXPORT_C CHierarchicalListItemDrawer::~CHierarchicalListItemDrawer()
	{
	if (iBitmaps)
		{
		const TInt count=iBitmaps->Count();
		for (TInt ii=0;ii<count;ii++)
			delete (*iBitmaps)[ii];
		delete iBitmaps;
		}
	}

EXPORT_C void CHierarchicalListItemDrawer::SetBitmapArray(CArrayPtr<CFbsBitmap>* aBitmaps)
	{
	iBitmaps=aBitmaps;
	}

EXPORT_C void CHierarchicalListItemDrawer::DrawActualItem(TInt aItemIndex,const TRect& aActualItemRect,
															TBool aItemIsCurrent,TBool aViewIsEmphasized,
															TBool /*aViewIsDimmed*/) const
	{
	iGc->UseFont(iFont);
	TRect itemRect(aActualItemRect);
	CEikonEnv* eikEnv=CEikonEnv::Static();
	iGc->SetPenStyle(CGraphicsContext::ESolidPen);
	iGc->SetPenColor(eikEnv->Color(EEikColorControlText)); //KDefaultLbxTextColor);
	iGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
	iGc->SetBrushColor(eikEnv->Color(EEikColorControlBackground)); //KDefaultLbxBackColor);
	DrawItemBitmap(aItemIndex,itemRect);

	if (aItemIsCurrent && aViewIsEmphasized)
		{
//		iGc->SetDrawMode(CGraphicsContext::EDrawModeNOTPEN);
		iGc->SetPenColor(eikEnv->Color(EEikColorControlHighlightText));
		iGc->SetBrushColor(eikEnv->Color(EEikColorControlHighlightBackground));
		}
	DrawItemText(aItemIndex,itemRect); 
	if (aItemIsCurrent && !aViewIsEmphasized)
		{
		iGc->SetPenStyle(CGraphicsContext::ESolidPen);
		iGc->SetBrushStyle(CGraphicsContext::ENullBrush);
		iGc->SetPenColor(eikEnv->Color(EEikColorControlText)); //KDefaultLbxHighlightRectColor);
		itemRect.iTl.iX-=2;
		iGc->DrawRect(itemRect);//aActualItemRect);
		}
	iGc->CancelClippingRect();
	iGc->Reset();
	}

EXPORT_C TInt CHierarchicalListItemDrawer::ItemWidthInPixels(TInt aItemIndex) const
	{
	TInt itemWidth=0;
	if (iDrawMark)
		itemWidth+=iMarkColumnWidth+iMarkGutter;
	TPtrC text=iModel->ItemText(aItemIndex);
	itemWidth+=iFont->TextWidthInPixels(text);
	if (ItemBitmap(aItemIndex))
		{
		itemWidth+=ItemBitmapSize().iWidth;
		itemWidth+=KBitmapGutter;
		}
	return itemWidth;
	}

EXPORT_C void CHierarchicalListItemDrawer::DrawItemBitmap(TInt aItemIndex,TRect& aActualItemRect) const
	{
	CFbsBitmap* icon=ItemBitmap(aItemIndex);
	if (icon)
		{
		const TSize iconSize=icon->SizeInPixels();
		TPoint iconPos(aActualItemRect.iTl.iX,(aActualItemRect.Height()-iconSize.iHeight)/2);
		iconPos.iY+=aActualItemRect.iTl.iY;
		iGc->BitBlt(iconPos,icon);
		const TRect rect(aActualItemRect.iTl,TSize(iconSize.iWidth+KBitmapGutter,aActualItemRect.Height()));
		const TRect actualBitmapRect(iconPos,iconSize);
		TRgb color[2];
		color[0]=KRgbWhite;
		color[1]=CEikonEnv::Static()->Color(EEikColorControlBackground);
		iGc->MapColors(actualBitmapRect, color, ETrue);
		EikDrawUtils::ClearBetweenRects(*iGc,rect,actualBitmapRect);
		iGc->SetPenStyle(CGraphicsContext::ESolidPen);
		iGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
		aActualItemRect.iTl.iX=rect.iBr.iX;
		}
	}

EXPORT_C void CHierarchicalListItemDrawer::DrawItemText(TInt aItemIndex, const TRect& aItemTextRect) const
	{
	TPtrC text=iModel->ItemText(aItemIndex);
	iGc->UseFont(iFont);
	const TInt extraVerticalSpace=(aItemTextRect.Height()-iFont->HeightInPixels());
	const TInt baseLineOffset=extraVerticalSpace/2 + iFont->AscentInPixels();
	iGc->DrawText(text,aItemTextRect,baseLineOffset);
	}

EXPORT_C TSize CHierarchicalListItemDrawer::ItemBitmapSize() const
// assumes all Bitmaps are the same size
	{
	if (iBitmaps)
		return (*iBitmaps)[0]->SizeInPixels();
	return TSize(0,0);
	}

EXPORT_C CHierarchicalListBoxModel* CHierarchicalListItemDrawer::HlModel() const
	{
	return STATIC_CAST(CHierarchicalListBoxModel*,iModel);
	}
