#pragma once
#include "blockitem.h"

class CBlockItem_VirtualProps;
class CBlockItem_Input;
class CBlockItem_Output;

class CBlockItem_Virtual : public CBlockItem
{
	DECLARE_SERIAL(CBlockItem_Virtual)
protected:
	CBlockItem_Virtual(void);				// konstruktor
	virtual ~CBlockItem_Virtual(void);				// destruktor
private:
	CObList m_olBlockList;
	CString	m_strName;
	CString	m_strDesc;

	CBlockItem_VirtualProps* m_pWndProps;

	CBlockItem_Input **m_pInputBlocksArray;
	CBlockItem_Output **m_pOutputBlocksArray; // pak dodelat i vystupy
	BLOCKDATA m_blockData;

public:
	static CBlockItem_Virtual* CreateInstance();
											// staticka metoda pro vytvoreni instance tridy
	CString GetName() const;				// vrati jmeno bloku
	CString GetDescription() const;			// vrati popis bloku
	CString GetInputPortName(DWORD dwPort) const;
											// vrati nazev vstupniho portu
	CString GetOutputPortName(DWORD dwPort) const;
											// vrati nazev vystupniho portu
	CString GetStatus() const;

	BOOL SetName(const CString strName);	// nastavi jmeno bloku
	BOOL SetDescription(const CString strDesc);
											// nastavi popis bloku

	virtual BOOL InitInstance();			// volano pri umisteni bloku do schematu
	virtual BOOL ExitInstance();			// volano pri odebrani bloku ze schematu 

	virtual BOOL Run();						// volano pri spusteni processingu
	virtual BOOL Stop();					// volano pri ukonceni processingu

	POSITION GetFirstBlock() const;			// vrati pozici prvniho bloku
	CBlockItem* GetNextBlock(POSITION& pos) const;
											// vraci blok a postupuje vpred
	POSITION GetLastBlock() const;
											// vraci pozici posledniho bloku
	CBlockItem* GetPrevBlock(POSITION& pos) const;
											// vraci blok a postupuje vzad
	BOOL InsertBlock(const CBlockItem *pBlock);
											// vlozi blok do tohoto virtualniho bloku
	BOOL DeleteBlock(CBlockItem *pBlock);
											// smaze blok z tohoto virtualniho bloku
	virtual void Serialize(CArchive& ar);
											// serializuje obsah bloku
	void StoreConnections(CArchive& ar);
											// pouzito v serializaci k ulozeni spojeni bloku
	void LoadConnections(CArchive& ar);
											// pouzito v serializaci k nacteni spojeni bloku
	BOOL ShowProperties(BOOL bTest = FALSE);
											// Otevre okno s nastavenim
	BOOL SetDocPtr(CSchemeDoc *ptr);
											// nastavi pointer na dokumenent
	virtual BOOL SetInputCount(const DWORD dwPorts);
											// nastavi pocet vstupnich portu
	virtual BOOL SetOutputCount(const DWORD dwPorts);
											// nastavi pocet vystupnich portu
	BOOL SetInputBlock(DWORD dwPort, CBlockItem_Input* ptr);
											// pridruzi k vstupnimu portu vstupni blok
	BOOL GetInputBlock(DWORD dwPort, CBlockItem_Input** pptr);
											// vrati vstupni blok pridruzeny k vstupnimu portu
	BOOL SetOutputBlock(DWORD dwPort, CBlockItem_Output* ptr);
											// pridruzi k vystupnimu portu vstupni blok
	BOOL GetOutputBlock(DWORD dwPort, CBlockItem_Output** pptr);
											// vrati vystupni blok pridruzeny k vstupnimu portu
	void SerializeBlocks(CArchive& ar);

	BOOL GetModifiedFlag();					// vraci, zda byl nektery z podrizenych realnych bloku zmenen
	VOID SetModifiedFlag(BOOL bModified);	// vraci, zda byl nektery z podrizenych realnych bloku zmenen

	BOOL RefreshInputBlocks();
	BOOL RefreshOutputBlocks();

	// ZPRATELENE TRIDY
	friend class CBlockItem_Input;
	friend class CBlockItem_Output;

	// metody pro processing

	virtual BOOL ProcessRev(const DWORD dwProcessId, REVDATAMAP &rRevDataMap);
	virtual BOOL ProcessData(const LPBLOCKDATA pInputData);
public:
	virtual const PORTDATA GetOutputPortData(DWORD dwPort) const;
	virtual LPCRITICAL_SECTION GetOutputCriticalSectionPtr(DWORD dwPort) const;
	virtual BOOL Process(DWORD dwProcessId, REVDATAMAP &rRevDataMap);
};
