////////////////////////////////////////////////////////////////////////////////
// GLButton.h
// Copyright Bjoern Ganster 2007
////////////////////////////////////////////////////////////////////////////////

#include "Config.h"
#include "Font.h"
#include "GLButton.h"

#define FILE_NUMBER FILE_NO_GLBUTTON_CPP

////////////////////////////////////////////////////////////////////////////////
// Constructor

GLButton::GLButton (GLWindow* _parent, int _left, int _top, int _width, int _height)
: GLWindow("GLButton", GLButton_ID, _parent, _left, _top, _width, _height),
   mTextColor(0, 0, 0)
{
	Config* config = getConfig();
	mTextColor = config->getTextColor();
	backgroundColor = config->getInactiveModeButtonColor();
}

////////////////////////////////////////////////////////////////////////////////
// Destructor

GLButton::~GLButton()
{
}

////////////////////////////////////////////////////////////////////////////////
// Render

void GLButton::render(int x, int y, int w, int h)
{
	SET_SCOPE;
	prepareToRender(x, y, w, h);
	glDisable (GL_TEXTURE_2D);
	glDisable (GL_DEPTH_TEST);

	mTextColor.glColor();

	Font* font = getDefaultFont();
	int textWidth = font->textWidth(mTitle);
	int textLeft = (width - textWidth) / 2;
	int textTop = (height - font->getCharHeight()) / 2;
	glTranslated(-1.0, 1.0, 0.0);
	glScaled(2/((double) getWidth()), -2/((double) getHeight()), 1.0);
	font->renderText(getTitle(), textLeft, textTop, width);
	RETURN;
}

////////////////////////////////////////////////////////////////////////////////
// Events

void GLButton::keypressed (BGKey key, bool shiftHeld, bool ctrlHeld, bool down, bool repeat)
{
}

////////////////////////////////////////////////////////////////////////////////
// Button state changed over a window: returns child that was clicked

GLWindow* GLButton::buttonStateChanged (int button, bool down, 
   int x, int y)
{ 
   if (button == 1 
   &&  !down
   &&  listener != NULL
   &&  x >= left
   &&  x < left+width
   &&  y >= top
   &&  y < top+height)
   {
      sendMessage (listener, ButtonClickedEvent);
   }
   return NULL; 
}

////////////////////////////////////////////////////////////////////////////////
// Event: widget looses focus

void GLButton::loseFocus ()
{
}

// Title access
const BGCPString& GLButton::getTitle () const
{
	return mTitle;
}

void GLButton::setTitle (const BGCPString& newTitle) 
{
	mTitle = newTitle;
}

void GLButton::setTitle (int textNum)
{
	mTitle = tr(textNum);
}

void GLButton::mouseMoved (int /*x*/, int /*y*/)
{
}
