/*********************************************************************
*	ContainerSimpleBase
*	SOURCE FILE
*	Autor:	Michal Jirouš
*	Datum: 1.7.2008
*	Soubor: containersimplebase.cpp
*	Popis: Zaklad vsech jednoduchych kontejneru
**********************************************************************/

#include "gfg.h"

bool ContainerSimpleBase::noFocusableTillStart()
{
	ContainerElement *tmp = m_Components.back();
	while( tmp != m_pFirstElement )
	{
		tmp = tmp->m_pUp;
		if( tmp->m_pComponent->isFocusable() )
			return false;
	}
	return true;
}

bool ContainerSimpleBase::noFocusableTillEnd()
{
	ContainerElement *tmp = m_Components.back();
	while( tmp != m_pLastElement )
	{
		tmp = tmp->m_pDown;
		if( tmp->m_pComponent->isFocusable() )
			return false;
	}
	return true;
}


//Funkce se snazi prehodit fokus dle parametru klavesy key
bool ContainerSimpleBase::changeFocusBySpecKey( int key )
{
	if( m_Components.empty() )
		return false;

	switch( key )
	{
		case GFG_KEY_UP:
		case GFG_KEY_LEFT:
			//pokud jsem na zacatku a nejaky predchudce muze predat fokus nekomu jinemu, tak zde koncim
			if( noFocusableTillStart() && shouldIlostFocus() )
				return false;
			//jinak hledam prvni fokusovatelny prvek
			changeFocusedItem( findFirstNextFocusable( m_Components.back(), m_Components.back()->m_pUp, GFG_KEY_UP ), GFG_KEY_UP );
			return m_Components.back()->m_pComponent->isFocusable();
		case GFG_KEY_DOWN:
		case GFG_KEY_TAB:
		case GFG_KEY_RIGHT:
			if( noFocusableTillEnd() && shouldIlostFocus() )
				return false;
			changeFocusedItem( findFirstNextFocusable( m_Components.back(), m_Components.back()->m_pDown, GFG_KEY_DOWN ), GFG_KEY_DOWN );
			return m_Components.back()->m_pComponent->isFocusable();
	}

	return false;
}

//Funkce nastavi fokus komponente v seznamu dle parametru type - klavesa
void ContainerSimpleBase::gotFocus( int type )
{
	if( m_Components.empty() )
		return;

	switch( type )
	{
		case GFG_KEY_UP:
		case GFG_KEY_LEFT:
			if( !m_pFirstElement->m_pComponent->isFocusable() )
				changeFocusedItem( findFirstNextFocusable( m_pLastElement, 
					m_pFirstElement->m_pDown, GFG_KEY_UP ), 0 );
			else
				changeFocusedItem( m_pLastElement, GFG_KEY_UP );
			break;
		case GFG_KEY_DOWN:
		case GFG_KEY_TAB:
		case GFG_KEY_RIGHT:
			if( !m_pFirstElement->m_pComponent->isFocusable() )
				changeFocusedItem( findFirstNextFocusable( m_pFirstElement, 
					m_pFirstElement->m_pDown, GFG_KEY_DOWN ), 0 );
			else
				changeFocusedItem( m_pFirstElement, GFG_KEY_DOWN );
			break;
		default:
			if( !m_Components.back()->m_pComponent->isFocusable() )
				changeFocusedItem( findFirstNextFocusable( m_Components.back(), 
					m_Components.back()->m_pDown, 0 ), 0 );
			else
				changeFocusedItem( m_Components.back(), 0 );
			break;
	}
}
