/****************************************************************************
	Knihovna obsahuje metody tridy TScreen, ktera slouzi jako zakladni jednotka
	pro spravu grafickych objektu.

*****************************************************************************/

#include "GR_screen.h"
#include "GLCD.h"
#include "GRAPHICS.h"

/****************************************************************************
	Metoda vykresli vsechny objekty, ktere jsou v instanci screenu povoleny.

	Vstup: 
		není

	Výstup:
		není

*****************************************************************************/
void TScreen::Draw(void)
{
	//Pokud neni platna trida, konci
	if (this == 0)
		return;
	
	LCD_Set_Font(this->font);										//Nastav vychozi font
	if (this->fullScreen == TRUE)									//Pokud je obrazovka definovana jako FullScreen
	{
		LCD_clear();												//Preskresli pozadi
	}
	else
	{
		
	}
	for (unsigned char i = 0; i < this->object_count; i++)			//pro kazdy objekt v instanci
	{
		if (this->objects[i].state == OBJECT_ENABLED)				//pokud je ENABLED
		{
			this->objects[i].draw(&this->objects[i],MSG_COMPLETE);	//proved vykresleni
		}
	}
}

/****************************************************************************
	Inicializace instance tridy

	Vstup: 
		Max_count:			pocet objektu v obraze
		Font:				vychozi font obrazovky

	Výstup:
		není

*****************************************************************************/
void TScreen::Init(unsigned char Max_count, FONT *Font)
{

	Init(Max_count,this->internalObjects,Font,TRUE);
}


/****************************************************************************
	Inicializace instance tridy

	Vstup: 
		Max_count:			pocet objektu v obraze
		Font:				vychozi font
		FullScreen:			celoobrazovkovy rezim

	Výstup:
		není

*****************************************************************************/
void TScreen::Init(unsigned char Max_count, FONT *Font, char FullScreen)
{
	Init(Max_count,this->internalObjects,Font,FullScreen);
}

/****************************************************************************
	Inicializace s alternativnim polem prvku

	Vstup: 
		Max_count:			pocet prvku v obraze
		objects:			ukazatel na pole objektu
		Font:				vychozi pismo

	Výstup:
		není

*****************************************************************************/
void TScreen::Init(unsigned char Max_count, TScreenObject* objects, FONT *Font)
{
	Init(Max_count,objects,Font,TRUE);
}


/****************************************************************************
	Inicializace tridy s alternativnim polem prvku

	Vstup: 
		Max_count:			pocet objektu v obraze
		objects:			pole objektu
		Font:				vychozi pismo
		FullScreen:			celoobrazovkovy rezim

	Výstup:
		není

*****************************************************************************/
void TScreen::Init(unsigned char Max_count, TScreenObject* objects, FONT *Font, char FullScreen)
{
	this->object_count = Max_count;
	this->objects =  objects;
	this->font = Font;
	this->fullScreen = FullScreen;
}


/****************************************************************************
	Metoda povoli vsechny objekty v obraze

	Vstup: 
		není

	Výstup:
		není

*****************************************************************************/
void TScreen::EnableAllObjects(void)
{
	for (int i = 0; i < this->object_count; i++)
	{
			this->objects[i].state = OBJECT_ENABLED;
	}
}

/****************************************************************************
	Metoda zakaze vsechny objekty v obraze

	Vstup: 
		není

	Výstup:
		není

*****************************************************************************/
void TScreen::DisableAllObjects(void)
{
	for (int i = 0; i < this->object_count; i++)
	{
			this->objects[i].state = OBJECT_DISABLED;
	}
}

/****************************************************************************
	Metodfa provede prekresleni vybraneho objektu. Jako parametr prekresleni je 
	volena zprava MSG_COMPLETE

	Vstup: 
		object:			ID objektu

	Výstup:
		není

*****************************************************************************/
void TScreen::UpdateObject(short object)
{
	if (this->objects[object].draw != 0)
		this->objects[object].draw(&this->objects[object],MSG_COMPLETE);
}


/****************************************************************************
	Provede prekresleni vybraneho objektu s alternativni zpravou pro objekt

	Vstup: 
		object:			ID objektu
		message:		parametr prekresleni

	Výstup:
		není

*****************************************************************************/
void TScreen::UpdateObject(short object,OBJECT_MESSAGE message)
{
	if (this->objects[object].draw != 0)
		this->objects[object].draw(&this->objects[object],message);
}