/*********************************************************************
*	SDL to GFG Converter
*	SOURCE FILE
*	Autor:	Michal Jirouš
*	Datum: 24.7.2008
*	Soubor: SDL_to_GFG.cpp
*	Popis: Modul transformuje SDL udalosti na udalosti GFG
**********************************************************************/

#include "SDL_to_GFG.h"
using namespace conv;

void conv::normal_keyboard( int key, int state, CMainWindow *window )
{
	if( !window )
		return;

	if( state == SDL_KEYDOWN )
		window->inputController( GFG_KEYBOARD_DOWN, 0, 0, key, 0 ); 
	else
		window->inputController( GFG_KEYBOARD_UP, 0, 0, key, 0 ); 
}
void conv::special_keyboard( int key, int state, CMainWindow *window )
{
	if( !window )
		return;

	if( state == SDL_KEYDOWN )
		window->inputController( GFG_SPECIAL_KEY_DOWN, 0, 0, key, 0 ); 
	else
		window->inputController( GFG_SPECIAL_KEY_UP, 0, 0, key, 0 ); 
}



void conv::input( SDL_Event &event, CMainWindow *window )
{
	if( !window )
		return;

	switch( event.type )
	{
		case SDL_KEYDOWN:
		case SDL_KEYUP:
			{	
				if((event.key.keysym.unicode & 0xFF80) == 0 )	//pokud ano, tak mame ASCII znak a normal keyboard
				{
					int key = event.key.keysym.unicode & 0x7F;
					
					if( key == 0 )
					{
						switch( event.key.keysym.sym )
						{
							case SDLK_DELETE:
								key = GFG_KEY_DELETE;
								normal_keyboard( key, event.type, window );
								break;
						}
						
					
						switch( event.key.keysym.sym )
						{
							case SDLK_UP:
							case SDLK_DOWN:
							case SDLK_LEFT:
							case SDLK_RIGHT:
								key = GFG_KEY_UP - SDLK_UP + event.key.keysym.sym;
								special_keyboard( key, event.type, window );
								break;
						}
					
					}
					else
						normal_keyboard( key, event.type, window );
				}
				else
				{
					special_keyboard( event.key.keysym.unicode, event.type, window );
				}
				break;
			}
		case SDL_MOUSEBUTTONDOWN:
		case SDL_MOUSEBUTTONUP:
			window->inputController( GFG_MOUSE_BUTTON, event.button.x, window->getHeight() - event.button.y, event.button.button, event.button.state ); 
			break;
		case SDL_MOUSEMOTION:
			if( event.motion.state == SDL_PRESSED )
				window->inputController( GFG_MOUSE_MOTION, event.motion.x, window->getHeight() - event.motion.y, 0, 0 );
			else
				window->inputController( GFG_MOUSE_OVER, event.motion.x, window->getHeight() - event.motion.y, 1, 0 );
			break;
	}


}



