/****************************************************************************
	FuKnihovna pro kresleni grafickych objektu Tlacitko a Textove pole a 
	dalsi variace s temito objekty. je zde take implementovano prepinani
	kurzoru.

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

#include "GR_commons.h"
#include "GLCD.h"

ANSWER CursorOn = NO;					//Aktualni stav kurzoru na obrazovce


/****************************************************************************
	Defaultni fonty tlacitek OK/CANCEL
*****************************************************************************/
FONT FONT_BTN_OK = {RGB_BEIGE,FONT_SMALL,RGB_DARK_GREEN};
FONT FONT_BTN_CANCEL = {RGB_BEIGE,FONT_SMALL,RGB_DARK_RED};
FONT FONT_BTN_INFO_OK = {RGB_BEIGE,FONT_SMALL,RGB_DARK_BLUE};

/****************************************************************************
	Defaultni parametry tlacitek OK/CANCEL.

*****************************************************************************/
TScreenObjectParams PARAMS_BTN_OK = {80,30,&FONT_BTN_OK};
TScreenObjectParams PARAMS_BTN_CANCEL = {80,30,&FONT_BTN_CANCEL};
TScreenObjectParams PARAMS_BTN_INFO_OK = {80,30,&FONT_BTN_INFO_OK};

/****************************************************************************
	Funkce vykresli tvar tlacitka na zaklade zadanych parametru.

	Tlacitko ma zkosene rohy a bily okraj.

	Vstup: 
		obj:		instance objektu, ktery je kreslen
		msg:		zprava predavana kreslici funkci

	Výstup:
		není

*****************************************************************************/
void DrawButtonShape(TScreenObject* obj, OBJECT_MESSAGE msg)
{
#ifdef FIX_ALL_WARNINGS
	msg;																							//odstrani varovani na nepouzivany parametr
#endif
	TRect buttonRect = {obj->x, obj->y, obj->x+obj->params->width, obj->y+obj->params->height};		//definice obdelniku tlacitka
	LCD_fcrect(&buttonRect,obj->params->font->bg_color,(unsigned char)obj->params->height>>2);		//vykresli plny zkoseny obdelnik
	LCD_crect(&buttonRect,RGB_WHITE,(unsigned char)obj->params->height>>2);							//vykresli ramecek obdelniku
	LCD_Set_Font(obj->params->font);																//nastavi font
	LCD_Set_ROI(&buttonRect);																		//nastavi ROI
}

/****************************************************************************
	Funkce vykresli tlacitko a vypise jemu prirazeny text

	Tlacitko ma zkosene rohy a bily okraj.

	Vstup: 
		obj:		instance objektu, ktery je kreslen
		msg:		zprava predavana kreslici funkci

	Výstup:
		není

*****************************************************************************/
void DrawButton(TScreenObject * obj,OBJECT_MESSAGE msg)
{
	DrawButtonShape(obj,msg);							//vykresleni tvaru tlacitka
	LCD_Goto_XY(obj->x+11, obj->y+8);					//presun na pozici
	LCD_printf(obj->caption);							//tisk nazvu tlacitka
}

/****************************************************************************
	Funkce vykresli datove tlacitko 
	
	(s malym nazvem nahore a velkou informaci dole, napriklad nastaveni
	IP adresy)

	Tlacitko ma zkosene rohy a bily okraj.

	Vstup: 
		obj:		instance objektu, ktery je kreslen
		msg:		zprava predavana kreslici funkci

	Výstup:
		není

*****************************************************************************/
void DrawDataButtonSkelet(TScreenObject * obj,OBJECT_MESSAGE msg)
{
	DrawButtonShape(obj,msg);						//Vykresleni tvaru tlacitka
	LCD_Goto_XY(obj->x+8,obj->y-2);					//presun na pozici pro tisk nazvu
	LCD_Set_Font(obj->params->font);				//Nastaveni fontu (zejmena barvy)
	LCD_Set_Font_Size(FONT_MINIMAL);				//Nastaveni minimalniho fontu
	LCD_printf(obj->caption);						//Tisk maleho popisku nahore
	LCD_Set_Font(obj->params->font);				//Znovu nastaveni fontu
	LCD_Goto_XY(obj->x+6,obj->y+18);				//Presun na pozici pro tisk
}


/****************************************************************************
	Funkce vykresli tlacitko s bitmapou uprostred a textem, ktery je pod ni.

	Tlacitko ma tvar obdelniku a bily okraj.

	Vstup: 
		obj:		instance objektu, ktery je kreslen
		msg:		zprava predavana kreslici funkci

	Výstup:
		není

*****************************************************************************/
void DrawBitmappedButton(TScreenObject * obj,OBJECT_MESSAGE msg)
{
	TRect r = {obj->x,obj->y, obj->x+obj->params->width, obj->y+obj->params->height};			//definice obdelniku tlacitka
	DrawTextBoxShape(obj,msg);																	//vykresleni obdelniku
	if (obj->bitmap !=0)																		//Pokud je prirazena bitmapa
	{																							//vykresli bitmapu uprostred obrazku
		LCD_draw_bitmap_cond(obj->x+(integerDiv(obj->params->width,2)-integerDiv(obj->bitmap[0],2)),obj->y+(integerDiv(obj->params->height,2)-integerDiv(obj->bitmap[1],2)-(obj->caption == 0?0:integerDiv(LCD_get_font_height(obj->params->font->size),2)+3)),obj->bitmap,0);
	}

	if (obj->caption != 0)																				//Pokud ma tlacitko prirazeny text
	{
		
		LCD_Goto_XY(obj->x+4,obj->y+integerDiv(obj->params->height,2)+integerDiv(obj->bitmap[1],2)+3);	//presun na pozici pod obrazkem
		LCD_Set_Font(obj->params->font);																//nastaveni fontu
		LCD_Set_ROI(&r);																				//nastaveni ROI
		LCD_printf(obj->caption);																		//tisk textu
	}
	
}

/****************************************************************************
	Prepnuti kurzoru do opacneho stavu

	Tlacitko ma zkosene rohy a bily okraj.

	Vstup: 
		neni

	Výstup:
		není

*****************************************************************************/
void SwitchCursor(void)
{
	if (CursorOn== NO)
	{
		drawCursor(NO);
		CursorOn = YES;
	}
	else
	{
		CursorOn = NO;	
		drawCursor(YES);
	}
}

/****************************************************************************
	Vynuti stav kurzoru

	Vstup: 
		cur:			YES/NO

	Výstup:
		není

*****************************************************************************/
void ForceCursor(ANSWER cur)
{
	drawCursor(cur);
	CursorOn=cur;
}

/****************************************************************************
	Funkce vykresli textove pole.

	Vstup: 
		obj:			instance objektu, ktery je kreslen
		message:		zprava predavana kreslici funkci

	Výstup:
		není

*****************************************************************************/
void DrawTextBox(TScreenObject* obj ,OBJECT_MESSAGE message)
{
	DrawTextBoxShape(obj,message);			//Vykresleni tvaru textoveho pole
	LCD_Goto_XY(obj->x+5,obj->y+5);			//Presun na zacatek pole
	if (obj->caption!=0)					//Pokud je prirazen text
		LCD_cprintf(0,obj->caption,-1);		//vytiskne se bez kurzoru
}

/****************************************************************************
	Funkce vykresli Textove pole se stinem

	Vstup: 
		obj:			instance objektu, ktery je kreslen
		message:		zprava predavana kreslici funkci

	Výstup:
		není

*****************************************************************************/
void DrawTextBoxShadowed(TScreenObject* obj ,OBJECT_MESSAGE message)
{
	const int slide = 8;													//"vyska" pole nad povrchem
	TRect textAreaRect = {obj->x-slide, obj->y-slide, obj->x+obj->params->width+slide, obj->y+obj->params->height+slide};
	LCD_darken_rect(&textAreaRect,slide);									//Vykresleni zatmavene oblasti
	DrawTextBoxShape(obj,message);											//Vykresleni samotneho objektu
	LCD_Goto_XY(obj->x+5,obj->y+5);											//Presun na pozici pro tisk textu
	LCD_cprintf(0,obj->caption,-1);											//Tisk textu bez kurzoru
}


/****************************************************************************
	Funkce vykresli tvar textoveho pole

	Vstup: 
		obj:			instance objektu, ktery je kreslen
		message:		zprava predavana kreslici funkci

	Výstup:
		není

*****************************************************************************/
void DrawTextBoxShape(TScreenObject* obj ,OBJECT_MESSAGE message)
{

#ifdef FIX_ALL_WARNINGS
	message;
#endif
	TRect textAreaRect = {obj->x, obj->y, obj->x+obj->params->width, obj->y+obj->params->height};				//definice obdelniku
	TRect realTextAreaRect = {obj->x+5, obj->y+8, obj->x+obj->params->width-5, obj->y+obj->params->height-4};	//definice ROI
    if (message != MSG_NO_BACKGROUND)																			//pokud neni zakazano kresleni pozadi
         LCD_frect(&textAreaRect,obj->params->font->bg_color);													//vykresleni pozadi
	LCD_rect(&textAreaRect,2,RGB_WHITE);																		//vykresleni ramecku
	LCD_Set_Font(obj->params->font);																			//Nastaveni fontu
	LCD_Set_ROI(&realTextAreaRect);																				//Nastaeni ROI
}

