// EIKCLB.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//
#include <badesca.h>
#include <barsread.h>
#include <eikenv.h>
#include <eiktxtut.h>
#include <eikclbd.h>
#include <eikclb.h>

//
//	class CColumnListBoxModel
//

EXPORT_C CColumnListBoxModel::CColumnListBoxModel()
//
//	C'tor
//
	{
	__DECLARE_NAME(_S("CColumnListBoxModel"));
	}

EXPORT_C CColumnListBoxModel::~CColumnListBoxModel()
//
//	D'tor
//
	{
	delete(iColumnData);
	}

EXPORT_C void CColumnListBoxModel::ConstructL(MDesCArray* aItemTextArray,TListBoxModelItemArrayOwnership aOwnershipType)
//
//	Deferred c'tor
//
	{
	iColumnData=CColumnListBoxData::NewL();
	CTextListBoxModel::ConstructL(aItemTextArray,aOwnershipType);
	}

EXPORT_C CColumnListBoxData* CColumnListBoxModel::ColumnData() const
//
//	Return the column data class
//
	{
	return(iColumnData);
	}

//
//	class CEikColumnListBox
//

EXPORT_C CEikColumnListBox::CEikColumnListBox()
//
//	C'tor
//
	{
	__DECLARE_NAME(_S("CColumnListBox"));
	}

EXPORT_C void CEikColumnListBox::ConstructL(CCoeControl* aParent,TInt aFlags,const CFont* aFont)
//
//	Defered constructor
//
	{
	CColumnListBoxModel* model=new(ELeave) CColumnListBoxModel;
	iModel=model;
	model->ConstructL();
	iItemDrawer=new(ELeave) CColumnListBoxItemDrawer(model,(aFont)? aFont : iEikonEnv->NormalFont());
	iItemDrawer->SetDrawMark(EFalse);
	CEikListBox::ConstructL(aParent,aFlags);
	}

EXPORT_C void CEikColumnListBox::ConstructFromResourceL(TResourceReader& aReader)
//
//	Override base classes resource contructor to provide column model and viewer
//
	{
	RestoreCommonListBoxPropertiesL(aReader);	
	iRequiredCellCharWidth=aReader.ReadInt16();
	iModel=new(ELeave) CColumnListBoxModel;
    TInt array_id=aReader.ReadInt32();
    if (!array_id)
		((CColumnListBoxModel*)iModel)->ConstructL();
	else
		{
		CDesCArray* desArray=iCoeEnv->ReadDesCArrayResourceL(array_id);
		CleanupStack::PushL(desArray);
		((CColumnListBoxModel*)iModel)->ConstructL(desArray);
		CleanupStack::Pop();
		}
	iItemDrawer=new(ELeave) CColumnListBoxItemDrawer((CColumnListBoxModel*)iModel,iEikonEnv->NormalFont());
	iItemDrawer->SetDrawMark(EFalse);
	((CColumnListBoxItemDrawer*)iItemDrawer)->SetCellWidthInChars(iRequiredCellCharWidth);
	CreateViewL();
	}

EXPORT_C CColumnListBoxModel* CEikColumnListBox::Model() const
//
//	Return the column model
//
	{
	return(CColumnListBoxModel*)iModel;
	}

//
//	class CColumnListBoxItemDrawer
//

EXPORT_C CColumnListBoxItemDrawer::CColumnListBoxItemDrawer(MTextListBoxModel* aTextListBoxModel,const CFont* aFont)
//
//	C'tor
//
	: CTextListItemDrawer(aTextListBoxModel,aFont)
	{
	__DECLARE_NAME(_S("CColumnListBoxItemDrawer"));
	}

EXPORT_C TSize CColumnListBoxItemDrawer::MinimumCellSize() const
	{
	CColumnListBoxData* data=ColumnData();
	const TInt columns=data->LastColumn();
	if (columns==-1)
		return CTextListItemDrawer::MinimumCellSize();
	TInt width=0;
	TInt height=0;
	TBool graphicsColumn=EFalse;
	for (TInt ii=0;ii<=columns;ii++)
		{
		width+=data->ColumnWidthPixel(ii);
		if (data->ColumnIsGraphics(ii))
			graphicsColumn=ETrue;
		else
			{
			const CFont* font=data->ColumnFont(ii);
			if(font)
				height=Max(height,font->HeightInPixels());
			}
		}
	if (graphicsColumn)
		{
		CArrayPtr<CFbsBitmap>* bitmapArray=data->BitmapArray();
		TInt bitmaps=bitmapArray->Count();
		for (TInt jj=0;jj<bitmaps;jj++)
			height=Max(height,(*bitmapArray)[jj]->SizeInPixels().iHeight);
		}
	height+=VerticalInterItemGap(); 
	return TSize(width,height);
	}

EXPORT_C TInt CColumnListBoxItemDrawer::ItemWidthInPixels(TInt /*aItemIndex*/) const
	{
	CColumnListBoxData* data=ColumnData();
	const TInt columns=data->LastColumn();
	TInt itemWidth = 0;
	if (iDrawMark)
		itemWidth += (iMarkColumnWidth + iMarkGutter);
	for (TInt ii=0;ii<=columns;ii++)
		itemWidth+=data->ColumnWidthPixel(ii);
	return itemWidth;
	}

void CColumnListBoxItemDrawer::DrawCurrentItemRect(const TRect& aRect) const
//
//	Draw the item background
//
	{
	iGc->SetClippingRect(iViewRect);
	iGc->SetBrushStyle(CGraphicsContext::ENullBrush);
	iGc->SetPenColor(KDefaultLbxHighlightRectColor);
	iGc->DrawRect(aRect);
	iGc->CancelClippingRect();
	}

CColumnListBoxData* CColumnListBoxItemDrawer::ColumnData() const
//
//	Get the column data
//
	{
	return(((CColumnListBoxModel*)iModel)->ColumnData());
	}

EXPORT_C void CColumnListBoxItemDrawer::DrawItemText(TInt aItemIndex,const TRect& aItemTextRect,TBool aItemIsCurrent,TBool aViewIsEmphasized) const
//
//	Draw the items text
//
	{
	iGc->SetPenColor(iTextColor);
	iGc->SetBrushColor(iBackColor);
	TPtrC temp=iModel->ItemText(aItemIndex);
	ColumnData()->Draw(*iGc,&temp,aItemTextRect,(aItemIsCurrent && aViewIsEmphasized));
	if (aItemIsCurrent && (!aViewIsEmphasized))
		DrawCurrentItemRect(aItemTextRect);
	}
