//----------------------------------------------------
/**
	\file		ctk/inc/wedit.h
	\ingroup	visualization
	\ingroup	all

	\brief		Automat okna pro editaci parametru
				pro 3-radkovy displej
				<<< OPC04 >>>

	\author		ConTeK s.r.o., Petr Cernin
	\version	01.00
	\date		00.00.0000
*/
//----------------------------------------------------

#ifndef _WEDIT_H_
#define _WEDIT_H_

#include <ctktypes.h>
#include <datadef.h>
#include <wnd.h>


// forward deklarace

typedef struct _WEDIT_CTX WEDIT_CTX;

//----------------------------------------------------
/**
	\brief	Callback volany z automatu editacniho okna po potvrzeni nove hodnoty

	\param ctx	Ukazatel na kontext automatu

	\note		Callback by mel prekopirovat hodnotu ctx->NewData do
				ciloveho mista.
*/
//----------------------------------------------------


typedef void (* wEditSetProc_t) (PARAMETER_ITEM * const _param, const datavalue_t * const _newData);


//----------------------------------------------------
/**
	\brief	Callback volany pri chybe zadani editovane hodnoty
			(chybna syntaxe, prekroceni rozsahu)

	\param	ErrCode obsahuje chybovy kod vraceny funkci
			ddDataToStr()

	\note	Obsluha muze napr. vyvolat okno s popisem chyby
*/
//----------------------------------------------------

typedef void (* wEditErrorProc_t) (const uint8_t _errCode);


//----------------------------------------------------
//! \name	Priznaky typu editace (viz. parametr options funkce wEditInit() )
//@{

#define EO_INCREMENTAL		0x01	// Prirustkova editace
#define EO_EDIT				0x02	// Editace cislic
#define EO_IMMUPDATE		0x04	// Okamzity update
//@}

typedef enum _WEDIT_MODE
{
	EM_INCREMENTAL,		// Prirustkovy rezim
	EM_EDIT,			// Std editacni rezim
	EM_ENUM				// Vyber z vyctu
} WEDIT_MODE;


//----------------------------------------------------
//!	Edit result

typedef enum _WEDIT_RESULT
{
	ER_CANCEL,			// Editace parametru zruzena
	ER_OK,				// Editace parametru dokoncena vporadku
	ER_ERROR			// Editace parametru skoncila chybou
} WEDIT_RESULT;


//----------------------------------------------------
//! Kontext automatu editacniho okna

struct _WEDIT_CTX
{
	//! \name	Public polozky
	datavalue_t			NewData;		// Nova data

	//!	\name	Private polozky
	PARAMETER_ITEM		Param;			// Popisovac editovanych dat
	wEditSetProc_t		OnSetData;		// Callback volany pro nastaveni parametru
	wEditErrorProc_t	OnError;		// Callback volany pri chybne zadane hodnote
	datavalue_t			OrigData;		// Originalni data
	uint8_t				Options;		// Rezim editace

	//!	\name	Editovany text ma delku Width a je zleva doplnen mezerami
	valuestring_t		Text;			// Editovany text
	bool_t				Signed;			// Editace se znamenkem
	uint8_t				XCoord;			// Souradnice X textu hodnoty zprava
	bool_t				DecPoint;		// Editace s desetinnou teckou
	uint8_t				Width;			// Sirka editovaneho textu ve znacich (max 15 znaku)
	uint8_t				CurPos;			// pozice kurzoru (zleva)
	bool_t				CurVisible;		// priznak zobrazeneho kurzoru
	bool_t				Modified;		// Priznak zmenene hodnoty
	bool_t				DataSet;		// Priznak volaneho callbacku OnSetData
	WEDIT_MODE			EditMode;		// Aktualni rezim editace EM_xxx
	WEDIT_RESULT		EditResult;		// ER_xxx
};



//----------------------------------------------------
/**
	\brief	Inicializace automatu pred volanim editEvent

	\param	ctx			Ukazatel na strukturu automatu
	\param	code		Kod parametru, ktery se ma editovat
	\param	data		Ukazatel na editavnou hodnotu (ram)
	\param	options		Priznaky EO_xxx
	\param	onSetData	Callback volany pri zmene editovane hodnoty
	\param	onError		Callback volany pri nespravne zadane hodnote
	\param	userParam	Uzivatelsky parametr prekopirovany do ctx->UserParam

	\return	FALSE v pripade neplatneho kodu
*/
//----------------------------------------------------

bool_t wEditInitialize(WEDIT_CTX * const _ctx, const paramcode_t _code, 
	const uint8_t _options, wEditSetProc_t _onSetData,
	wEditErrorProc_t _onError);


//----------------------------------------------------
/**
	\brief	Funkce pro obsluhu udalosti editacniho okna

	\param	ctx			Ukazatel na strukturu automatu
	\param	event
	\param	info
*/
//----------------------------------------------------

void wEditEvent(WEDIT_CTX * const _ctx, const wndevent_t _event, const wndinfo_t _info);

#endif // _EDITWND_H_
