// EIKCAPCA.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <eikcapca.h>
#include <eikcapc.h>

const TInt KTopMargin=6;
const TInt KTopMarginSquash=2;
const TInt KVerticalSpacing=6;
const TInt KVerticalSpacingSquash=3;

EXPORT_C CEikCapCArray::CEikCapCArray(TInt aGranularity)
	: CArrayPtrFlat<CEikCaptionedControl>(aGranularity)
	{
	__DECLARE_NAME(_S("CEikCapCArray"));
	}

EXPORT_C CEikCapCArray::~CEikCapCArray()
	{
	ResetAndDestroy();
	}

EXPORT_C void CEikCapCArray::DeleteLine(TInt aIndex)
	{
	delete((*this)[aIndex]);
	Delete(aIndex);
	}

EXPORT_C void CEikCapCArray::SetDensePacking(TBool aDensePacking)
	{
	iDensePacking=aDensePacking;
	}

EXPORT_C TSize CEikCapCArray::MinimumSize()
	{
	TSize size(0,0);
	TInt wholeWidth=0;
	const TInt count=Count();
	const TInt topMargin=iDensePacking ? KTopMarginSquash : KTopMargin;
	const TInt verticalSpacing=iDensePacking ? KVerticalSpacingSquash : KVerticalSpacing;
	TInt deltaHeight=0;
	for (TInt ii=0;ii<count;++ii)
		{
		CEikCaptionedControl* line=(*this)[ii];
		TSize thisSize=line->MinimumSize();
		TInt thisDeltaHeight=thisSize.iHeight+verticalSpacing;
		if (deltaHeight<thisDeltaHeight)
			deltaHeight=thisDeltaHeight;
		const TInt thisCaptionWidth=line->iCaptionWidth;
		if (!(line->LatentGroupLineFollows()))
			{
			size.iHeight+=deltaHeight;
			deltaHeight=0;
			}
		if (!thisCaptionWidth)
			{
			if (wholeWidth<thisSize.iWidth)
				wholeWidth=thisSize.iWidth;
			}
		else
			{
			thisSize.iWidth-=thisCaptionWidth;
			if (iCaptionWidth<thisCaptionWidth)
				iCaptionWidth=thisCaptionWidth;
			if (size.iWidth<thisSize.iWidth)
				size.iWidth=thisSize.iWidth;
			}
		}
	size.iWidth+=iCaptionWidth;
	if (size.iWidth<wholeWidth)
		size.iWidth=wholeWidth;
	size.iHeight+=topMargin;
	return size;
	}

EXPORT_C void CEikCapCArray::SetRectL(const TRect& aRect)
	{
	TRect rect=aRect;
	const TInt fullWidth=rect.iBr.iX-rect.iTl.iX;
	const TInt count=Count();
	const TInt topMargin=iDensePacking ? KTopMarginSquash : KTopMargin;
	const TInt verticalSpacing=iDensePacking ? KVerticalSpacingSquash : KVerticalSpacing;
	rect.iTl.iY+=topMargin;
	TInt deltaHeight=0;
	for (TInt ii=0;ii<count;++ii)
		{
		CEikCaptionedControl* line=(*this)[ii];
	    TSize thisSize=line->MinimumSize();
		TInt thisDeltaHeight=thisSize.iHeight+verticalSpacing;
		if (deltaHeight<thisDeltaHeight)
			deltaHeight=thisDeltaHeight;
		if (!(line->iCaptionWidth))
			thisSize.iWidth=fullWidth;
		else
			{
			TInt deltaWidth=iCaptionWidth-line->iCaptionWidth;
			thisSize.iWidth+=deltaWidth;
			line->iCaptionWidth=iCaptionWidth;
			line->iMinSize.iWidth+=deltaWidth;
			}
		line->iFullWidth=fullWidth;
	    line->SetExtentL(rect.iTl,thisSize);
		if (!(line->LatentGroupLineFollows()))
			{
			rect.iTl.iY+=deltaHeight;
			deltaHeight=0;
			}
		}
	}

EXPORT_C void CEikCapCArray::ResetMinimumSizes()
	{
	const TInt count=Count();
	for (TInt ii=0;ii<count;++ii)
		(*this)[ii]->ResetMinimumSizes();
	}

EXPORT_C TInt CEikCapCArray::LineIndexFromId(TInt aControlId) const
	{
    const TInt count=Count();
    TInt ii=0;
    FOREVER
        {
        if (ii==count)
            return(KErrNotFound);
        if ((*this)[ii]->iId==aControlId)
            break;
		ii++;
        }
    return(ii);
	}

EXPORT_C void CEikCapCArray::AdjustAllIds(TInt aControlIdDelta)
	{
    const TInt count=Count();
	for (TInt ii=0; ii<count; ii++)
		(*this)[ii]->iId+=aControlIdDelta;
	}

EXPORT_C TInt CEikCapCArray::FindLineIndex(CCoeControl* aControl) const
	{
    const TInt count=Count();
    TInt ii=0;
	while (ii<count)
		{
		CEikCaptionedControl* line=(*this)[ii];
		if (line==aControl || line->iControl==aControl)
			return(ii);
		ii++;
		}
	return(KErrNotFound);
	}
