// EIKIMGAR.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <eikimgar.h>
#include <eikimgar.pan>
#include <eikimage.h>
#include <barsread.h>
#include <coemain.h>

// global functions

GLDEF_C void Panic(TEikImageArrayPanic aPanic)
	{
	User::Panic(_L("EIKON-IMAGE-ARRAY"), aPanic);
	}

//
// class CEikImageArray
//

EXPORT_C CEikImageArray::CEikImageArray()
	{
	__DECLARE_NAME(_S("CEikImageArray"));
	}

EXPORT_C CEikImageArray::~CEikImageArray()
	{
	if (iImageArray)
		{
		iImageArray->ResetAndDestroy();
		delete iImageArray;
		}
	}

EXPORT_C void CEikImageArray::ConstructL()
	{
	iImageArray=new(ELeave) CArrayPtrFlat<CEikImage>(8);
	}

EXPORT_C void CEikImageArray::InsertImageL(TInt aIndex, CEikImage* aImage)
	//
	// takes ownership of aImage
	//
	{
	__ASSERT_DEBUG(aImage, Panic(EEikImageArrayPanicNullImage));
	aImage->SetContainerWindowL(*this);
	aImage->SetSizeL(aImage->MinimumSize());
	iTotalImageWidth+=aImage->Size().iWidth;
	iImageArray->InsertL(aIndex, aImage);
	}

EXPORT_C void CEikImageArray::RemoveImage(TInt aIndex)
	{
	iTotalImageWidth-=((*iImageArray)[aIndex])->Size().iWidth;
	iImageArray->Delete(aIndex);
	}

EXPORT_C void CEikImageArray::AppendImageL(CEikImage* aImage)
	{
	//
	// takes ownership of aImage
	//
	__ASSERT_DEBUG(aImage, Panic(EEikImageArrayPanicNullImage));
	InsertImageL(iImageArray->Count(), aImage);
	}

EXPORT_C TInt CEikImageArray::NumberOfImages() const
	{
	return iImageArray->Count();
	}

EXPORT_C void CEikImageArray::MakeImageVisible(TInt aIndex, TBool aVisible) const
	{
	((*iImageArray)[aIndex])->MakeVisible(aVisible);
	}

EXPORT_C TSize CEikImageArray::MinimumSize()
	{
	TSize size;
	TInt maxHeight=0;
	TInt totalWidth=0;
	for (TInt i=0; i<iImageArray->Count(); i++)
		{
		size=((*iImageArray)[i])->MinimumSize();
		maxHeight=Max(maxHeight, size.iHeight);
		totalWidth+=size.iWidth;
		}
	size=TSize(Max(totalWidth, iSize.iWidth), maxHeight);
	return size;
	}

EXPORT_C void CEikImageArray::ConstructFromResourceL(TResourceReader& aReader)
	{
	ConstructL();

	iSize.iWidth=aReader.ReadInt16();
    TInt imageGroupId=aReader.ReadInt32();

    TResourceReader reader;
    iCoeEnv->CreateResourceReaderLC(reader,imageGroupId);
	const TInt count=reader.ReadInt16();
	for (TInt ii=0;ii<count;++ii)
		{
		CEikImage* image=new(ELeave) CEikImage;
		CleanupStack::PushL(image);
		image->ConstructFromResourceL(reader);
		AppendImageL(image);
		CleanupStack::Pop();
		}
	CleanupStack::PopAndDestroy(); // reader
	}

void CEikImageArray::SizeChangedL()
	{
	TInt count=iImageArray->Count();
	TInt spaceBetween=(iSize.iWidth-iTotalImageWidth)/(count-1);
	TInt offsetFromLeft=0;
	TPoint pos;
	TSize size;
	for (TInt i=0; i<count; i++)
		{
		size=((*iImageArray)[i])->Size();
		pos.iY=(iSize.iHeight-size.iHeight)/2;
		pos.iX=offsetFromLeft;
		((*iImageArray)[i])->SetPosition(iPosition+pos);
		offsetFromLeft+=size.iWidth+spaceBetween;
		}
	}

TInt CEikImageArray::CountComponentControls() const
	{
	return iImageArray->Count();
	}

CCoeControl* CEikImageArray::ComponentControl(TInt aIndex) const
	{	 
	return (*iImageArray)[aIndex];
	}

