/*********************************************************************
*	CheckButton
*	SOURCE FILE
*	Autor:	Michal Jirouš
*	Datum: 30.6.2008
*	Soubor: checkbutton.cpp
*	Popis: zatrzitko ma dva stavy. Zaskrtnute a nezaskrtnute. V prvnim pripade
*			krome zakladniho vykreslovani zobrazi rotujici zaskrtnuti.
**********************************************************************/

#include "gfg.h"

//Inicializace, nastaveni parametru vykreslovani
void CheckButton::init()
{
	//vytvoreni rotujiciho obrazku
	m_Image = new Image( m_fHeight, m_fHeight );
	m_Image->loadImage( "textures/icons/accept.tga" );
	m_Image->setParent( this );
	m_Image->setRealSizeDraw( false );
	m_ColorBackGround = GFG_COLOR_TEXTBOX_TEXT;
	m_Image->setColorBackGround( m_ColorBackGround );
	
	m_bSwitched = false;
	m_fRotate = 0;

	setTextureIdle( "GFG_SWITCH_IDLE" );
	setTexturePushed( "GFG_SWITCH_PUSHED" );

	m_ColorCaptionMouseOver = GFG_COLOR_BUTTON_CAPTION_MOUSEOVER;
	m_ColorCaptionIdle = GFG_COLOR_BUTTONSWITCH_TEXT_IDLE;
	m_ColorMouseOver = GFG_COLOR_BUTTON_CAPTION_MOUSEOVER;
	m_ColorIdle = GFG_COLOR_BUTTONSWITCH_TEXT_IDLE;

	recalculate();
}

void CheckButton::switchBaseInit()
{
	m_Image = NULL;
	m_bSwitched = false;
	m_fRotate = 0;
}

CheckButton::~CheckButton()
{
	delete m_Image;
}

//Reakce na kliknuti
bool CheckButton::onMouseButtonUp( float x, float y, int button, bool isOnArea)
{
	if( isOnArea && m_bPushed)
	{
		m_bPushed = false;
		onClick();	
		m_bSwitched ^= 1;
		if( m_bSwitched )	//pokud se vraci do stavu NEZASKRTNUTE, tak se resetuje rotace
			m_fRotate = 0;
		return true;
	}
	return false;
}

//Pri zmene velikosti nebo pozice je treba nastavit tyto vlastnosti i rotujicimu obrazku
void CheckButton::recalculate()
{
	if( m_Image )
	{
		m_Image->setPosition(  m_ScissorBox.x, m_ScissorBox.y );
		m_Image->setSize( min(m_ScissorBox.h, m_ScissorBox.w), m_ScissorBox.h );
	}
}

void CheckButton::draw(ScissorBox &scissorBox)
{
if( !m_bVisible )
		return;

	glPushAttrib( GL_CURRENT_BIT | GL_ENABLE_BIT | GL_SCISSOR_BIT );
	glEnable( GL_TEXTURE_2D );
	glEnable(GL_BLEND);
	glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
	
	if( m_pTexture_down && m_pTexture_up )
	{
		if( m_bPushed )
			glBindTexture( GL_TEXTURE_2D, m_pTexture_down->texture_id );
		else
			glBindTexture( GL_TEXTURE_2D, m_pTexture_up->texture_id );
	}
	
	if( m_bMouseOver)
		setColor( m_ColorMouseOver );
	else
		setColor( m_ColorIdle );
	
	ScissorBox intersected = m_ScissorBox.intersection( scissorBox );
	glScissor( (GLint)intersected.x, (GLint)intersected.y, (GLint)intersected.w, (GLint)intersected.h );

	glBegin( GL_QUADS );
		glTexCoord2i(0,0);	glVertex2f( m_ScissorBox.x, m_ScissorBox.y );
		glTexCoord2i(1,0);	glVertex2f( m_ScissorBox.x + min(m_ScissorBox.h, m_ScissorBox.w), m_ScissorBox.y );
		glTexCoord2i(1,1);	glVertex2f( m_ScissorBox.x + min(m_ScissorBox.h, m_ScissorBox.w), m_ScissorBox.y + m_ScissorBox.h );
		glTexCoord2i(0,1);	glVertex2f( m_ScissorBox.x , m_ScissorBox.y + m_ScissorBox.h );
	glEnd();
	
	
	//vykresleni obrazku pouze v pripade, ze tlacitko je zaskrtnute
	if( m_bSwitched && m_Image)
	{
		float x_move = m_Image->getXPosition() + m_Image->getWidth() / 2.0f;
		float y_move = m_Image->getYPosition() + m_Image->getHeight() / 2.0f;

		//rotace
		glPushMatrix();
			glTranslatef( x_move, y_move, 0 );
			glRotatef( m_fRotate, 0, 0, 1 );
			glTranslatef( -x_move, -y_move, 0 );
			m_Image->draw( intersected );
		glPopMatrix();
	}

	if( m_bMouseOver )
		setColor( m_ColorCaptionMouseOver );
	else
		setColor( m_ColorCaptionIdle );
	//TODO
	if( !m_dsCaption.empty() )
		m_dsCaption.draw( m_fGlobalXpos + m_fHeight + 10, m_fGlobalYpos + m_fHeight/2 );
	glPopAttrib();

}

void CheckButton::setCaption( string text, int iAlign )
{
	m_dsCaption = fontLibrary::DString( text, "SERIF", iAlign );
}
void CheckButton::setCaption( string text, string font, int iAlign )
{
	m_dsCaption = fontLibrary::DString( text, font, iAlign );
}
void CheckButton::setCaption( string text, Font *font, int iAlign )
{
	m_dsCaption = fontLibrary::DString( text, font, iAlign );
}



//reakce na udalost zmeny pozice
void CheckButton::onComponentTranslate( float x, float y )
{
	if( m_Image )
		m_Image->setPositionOffset( x, y );
}

void CheckButton::setAlphaMultiplier( float multiplier )
{
	m_fAlphaMultiplier = multiplier;
	if( m_Image  ) 
		m_Image->setAlphaMultiplier( m_fAlphaMultiplier );
}

//implementace animace rotace
void CheckButton::run()
{
	m_fRotate += GFG_CHECK_BUTTON_ANIMATION_STEP;
}
