/*********************************************************************
*	ContainerRelativeUpToDown
*	SOURCE FILE
*	Autor:	Michal Jirouš
*	Datum: 1.7.2008
*	Soubor: container_relativeUD.cpp
*	Popis: Kontejner, kam se komponenty ukladaji shora dolu a rozdeluji si
*				mezi sebou vysku kontejneru.
**********************************************************************/

#include "gfg.h"
#include "mathematic.h"
//pridani nove komponentz
void ContainerRelativeUpToDown::addComponent( CBaseComponent *component, float priority )
{
	if( component == NULL || priority < 0.0f )
		return;


	m_fTotalPriority += priority;	//soucet priorit komponent

	component->setParent( this );
	ContainerElement *newElement = new ContainerElement;
	newElement->m_fInformation = priority;
	
	if( m_pFirstElement == NULL )
		m_pFirstElement = newElement;
	if( m_pLastElement == NULL )
		m_pLastElement = newElement;
	if( !m_Components.empty() )
	{
		newElement->m_pUp = m_pLastElement;
		m_pLastElement->m_pDown = newElement;
		m_pLastElement = newElement;
	}
	

	m_Components.push_back( newElement );
	m_Components.back()->m_pComponent = component;
	
	m_pFirstElement->m_pUp = m_pLastElement;
	m_pLastElement->m_pDown = m_pFirstElement;
	recalculate();
}

//funkce vzpocitava usporadani
void ContainerRelativeUpToDown::recalculate()
{
	float fNumComponents = (float)m_Components.size();
	float fGlobalXpos = m_ScissorBox.x + m_ScissorBox.w * m_fVerticalPaddingPercents / 2.0f;
	float fWidth = m_ScissorBox.w * ( 1.0f - m_fVerticalPaddingPercents );
	float fHeight = 0;
	float fGlobalYpos = 0;
	
	//vypocet prostoru mezi komponentami
	float fPadding = m_fHorizontalPaddingPercents * m_ScissorBox.h;
	float fPaddingPerComponent = fPadding / fNumComponents;

	float fCurrentYpos = m_ScissorBox.y;
	if( !m_bReverse )
		fCurrentYpos += m_ScissorBox.h;
	
	//zbyly prostor si mezi sebou koponenty rozdeli
	float fSpaceLeft = m_ScissorBox.h - fPadding;

	ContainerElement *first = m_pFirstElement;
	if( !first )
		return;

	//vypocet souradnic komponent
	do
	{
		fHeight = fSpaceLeft * first->m_fInformation / m_fTotalPriority;
		if( !m_bReverse )
			fCurrentYpos = fCurrentYpos - fPaddingPerComponent - fHeight;
		

		fGlobalYpos = fCurrentYpos + fPaddingPerComponent / 2.0f;

		first->m_pComponent->setPosition( fGlobalXpos, fGlobalYpos );
		first->m_pComponent->setSize( fWidth, fHeight );

		if( m_bReverse )
			fCurrentYpos = fCurrentYpos + fPaddingPerComponent + fHeight;

	}
	while( (first = first->m_pDown) != m_pFirstElement && first  );
}

void ContainerRelativeUpToDown::setHorizontalPadding( float percent )
{ 
	m_fHorizontalPaddingPercents = getFromRange( percent, 0.0f, 1.0f ); 
	recalculate();
}
	
void ContainerRelativeUpToDown::setVerticalPadding( float percent )
{ 
	m_fVerticalPaddingPercents = getFromRange( percent, 0.0f, 1.0f );
	recalculate();
}
