// PatternManager.h: interface for the CPatternManager class.
//
//////////////////////////////////////////////////////////////////////

/** \file PatternManager.h
	\brief Rozhraní pro třídu CPatternManager
*/

#if !defined(_PATTERNMANAGER_H_)
#define _PATTERNMANAGER_H_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "PrimitiveBase.h"
#include "PixelArray.h"
#include "Circle.h"
#include "Line.h"
#include "Camera.h"
#include <afxcoll.h>
using namespace std;



/** Třída spravujicí seznamy vytvořených vrstev testovacího vzoru.
	Obsahuje seznam všech vytvořených vrstev a seznam vrstev použitých pro testovací vzor a práci s nimi.
	Sestavuje testovací vzor.
*/
class CPatternManager : public CObject  
{

	//MR END
private:
	CPixelArray* m_outPattern;		///< Uložiště pro výsledný obraz testovacího vzoru
	CObList m_listLayerCreated;		///< Seznam všech vytvořených vrstev (indexován od 0)	
	CObList m_listLayerRegistred;	///< Seznam zařazených vrstev pro testovací vzor (indexován od 0)
	POSITION m_pos;					///< Ukazatel na pozici v seznamech
	char* m_patternName;			///< Název výsledného testovacího vzoru
	string m_outputName;			///< název pro ukládaný výsledný soubor
	bool m_bDisplay;				///< Příznak určující zobrazení vzoru.
	bool m_bSave;					///< Příznak určující uložení vzoru. 
	CCamera cam;
	//int m_projDistance;				///< Vzdálenost proječní roviny od počátku optické osy
	int m_xSize, m_ySize;			///< velikost předlohy		
	CStructures::Supersample m_supersample;	///< Koeficient převzorkování
	double m_xScale,m_yScale;        // zvětšení v daném směru
	 

	//--------------- zrejme smazat !!!!!!!!!----------------------------------------
	//MR void GetPattern(CPrimitiveBase* cpatt);
	//MR void rot(double rotx[], double angleX, double abgleY); 
	//----------------------------------------------------------

public:
	CPatternManager();			///< Defaultni konstruktor
	virtual ~CPatternManager();	///< Destruktor

	//MR void Rename(const char* newName);				///< Přejmenuje název testovacího vzoru
	//MR const char* GetName(){return m_patternName;}	///< Vrátí název testovacího vzoru

	void Display(bool bDisplay){m_bDisplay = bDisplay;}	///< Nastaví příznak pro zobrazení. \c true = zobrazit, \c false = nezobrazovat
	bool Display(){return m_bDisplay;}					///< Vrátí příznak pro zobrazení
	void Save(bool bSave){m_bSave = bSave;}				///< Nastaví příznak pro uložení. \c true = uložit, \c false = neukládat
	bool Save(){return m_bSave;}						///< Vrátí příznak pro uložení

	void SetResolution(int xSize, int ySize);			///< Nastaví velikost testovacího vzoru
	CStructures::iPoint GetResolution();					///< Vrátí velikost testovacího vzoru
	void SetSize(int xSize,int ySize,double xScale, double yScale); // nastaví velikost a měřítko

	void SetCamera (CCamera const & camera) {cam = camera;}
//MRXXX nahrazeno SetCamera	
	void SetOutputName(char *name);
	void SetProjDistance(double projDistance){ cam.SetDistanceO (projDistance);}	///< Nastaví vzdálenost projekční roviny
/*MR v příkladu se nepoužívá	int GetProjDistance(){return m_projDistance;}							///< Vrátí vzdálenost projekční roviny

	void SetSupersample(CStructures::Supersample supersample);	///< Nastaví poměr převzorkování
/*MR v příkladu se nepoužívá	CStructures::Supersample GetSetSupersample(){m_supersample;}				///< Vrátí poměr převzorkování


	/** Přidá vytvořenou vrstvu na konec seznamu vytvořených.
		@param[in] pPrimitive - ukazatel na vytvořený objekt
	*/
	void AddLayer(CPrimitiveBase* pPrimitive);

	/** Zařadí vrstvu na danou pozici do seznamu pro tvorbu testovacího vzoru.
		Pokud není pozice nalezena, je vrstva zařazena na konec
		@param[in] pPrimitive - ukazatel na zařazovanou vrstvu
		@param[in] index - pozice na kterou se vrstva zařadí (počítano od 0), -1 = zařazena na konec
	*/
	void RegisterLayer(CPrimitiveBase* pPrimitive, int index);	//zaradi vrstvu do predlohy

	/** Odstraní vrstvu na dané pozici ze seznamu vrstev pro tvorbu testovacího vzoru.
		@param[in] index - pozice vrstvy k odstranění
		@return \c true = vrstva odstraněna, \c false = požadovaný index nebyl nalezen
	*/
	void UnregisterLayer(int index); //odstrani vrstvu z predlohy
	

	void RegisterAll();			///< Zařadí všechny vytvořené vrstvy do testovacího vzoru
	void UnregisterAll();		///< Odstrani všechny vrstvy z testovacího vzoru
	void Empty();				///< Vyprázdní oba seznamy vrstev
	void MoveUp(int index);		///< Přesune vrstvu na daném indexu v pořadí blíže ke kameře
	void MoveDown(int index);	///< Přesune vrstvu na daném indexu v pořadí dále od kamery

	/** Vrátí ukazatel na danou vrstvu v seznamu všech vytvořených vrstev.
		@param[in] index - pozice vrstvy
		@return ukazatel na vrstvu, v případně nenalezení vrací \c NULL
	*/
	CPrimitiveBase* GetLayerCreated(int index);		
	
	/** Vrátí ukazatel na danou vrstvu v seznamu zařazených vrstev.
		@param[in] index - pozice vrstvy
		@return ukazatel na vrstvu, v případně nenalezení vrací \c NULL
	*/
	CPrimitiveBase* GetLayerRegistred(int index);

	int GetCountCreated();		///< Vrátí počet všech vytvořených vrstev
	int GetCountRegistred();	///< Vrátí počet zařazených vrstev do testovacího vzoru

	/** Sestaví výsledný testovací vzor.
		Testovací vzor se může načíst ze souboru jako obrázek, nebo se sestaví ze zařazených
		vrstev.
		@param[in] useFile - \c false = testovací vzor se sestaví z vrstev, \c true = použije se soubor
		@param[in] fileName - název souboru 
		@return 0 - sestavení vzoru proběhlo v pořádku
		@return 1 - nejsou zařazeny žádné vrstvy
		@return 2 - nepodařilo se otevřít zadaný soubor
	*/
	int BuildMasterImage(bool bPreview, bool useFile = false, const char* fileName = "kamera.bmp");	//vytvori predlohu
	
	CPixelArray* GetPattern();	///< Vrátí vytvořenou předlohu

	//nepouzito - pozustatek z testovani
	//MR bool BuildPattern();
	//MR void BuildPatternOld(int width, int heigth);

};

#endif // !defined(_PATTERNMANAGER_H_)
