#ifndef Objekt_H
#define Objekt_H

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

namespace Framework
{
	struct VScrollData; // Scroll.h
	struct HScrollData; // Scroll.h
	class Punkt; // Punkt.h
	struct MausEreignis; // MausEreignis.h
	struct TastaturEreignis; // TastaturEreignis.h
	class Bild; // Bild.h
	class Objekt; // Aus dieser Datei
	class ObjektArray; // Aus dieser Datei

	class Objekt
	{
	protected:
		Punkt *pos;
		Punkt *gr;
		bool (*Mak)( void *, MausEreignis );
		bool (*Tak)( void *, TastaturEreignis );
		CRITICAL_SECTION Thread_Save;
		bool mausIn;

	public:
		// Konstruktor 
		Objekt();
		// Destruktor 
		~Objekt();
		// nicht constant 
		void lockObjekt();
		void unlockObjekt();
		void setMausEreignis( bool (*ak)( void *, MausEreignis ) ); // setzt das Maus Ereignis
		void setTastaturEreignis( bool (*ak)( void *, TastaturEreignis ) ); // setzt das TastaturEreignis
		virtual void doMausEreignis( MausEreignis *me ); // ruft Mak auf
		virtual void doTastaturEreignis( TastaturEreignis *te ); // ruft Tak auf
		virtual void tick( double tickval ); // tick
		void setPosition( Punkt *pos ); // setzt die position
		void setPositionZ( Punkt *pos ); // setzt einen Zeiger auf die Position
		void setGröße( Punkt *gr ); // setzt die Größe
		void setGrößeZ( Punkt *gr ); // setzt einen zeiger zur größe
		void setPosition( int x, int y ); // setzt die position
		void setGröße( int x, int y ); // setzt die Größe
		virtual void render( Bild *zrObj ); // zeichnet nach zrObj
		virtual void render( int xOff, int yOff, int bOff, int hOff, Bild *zrObj );
		// constant 
		bool hatMausEreignis() const; // prüft, ob Mak gesetzt ist
		bool hatTastaturEreignis() const; // prüft, ob Tak gesetzt ist
		Punkt *getPosition() const; // gibt die Position zurück
		Punkt *getGröße() const; // gibt die Größe zurück
		int getBreite() const; // gibt die Breite zurück
		int getHöhe() const; // gibt die Höhe zurück
		int getX() const; // gibt X zurück
		int getY() const; // gibt Y zurück
		// reference Counting 
	};

	class ObjektArray// Array von Objekten
	{
	private:
		Objekt *This;
		ObjektArray *next;
		int index;

	public:
		// Konstruktor 
		ObjektArray();
		// Destruktor 
		~ObjektArray();
		// nicht const 
		bool addObjekt( Objekt *obj ); // Fügt ein Objekt hinzu
		bool removeObjekt( Objekt *obj ); // Entfernt ein Objekt
		bool removeObjekt( int i ); // Entfernt das i-te Objekt
		void setNext0(); // Setzt das nächste Objekt zu 0
		void updateIndex( int i ); // aktualisiert die Index variable
		// constant 
		ObjektArray *getNext() const; // gibt das nächste Objekt zurück
		Objekt *getObjekt( int i ) const; // gibt das i-te Objekt zurück
		Objekt *getObjekt() const; // gibt das Objekt zurück
		int getIndex() const; // Gibt den Index zurück
		void sendMausAll( MausEreignis *me ) const; // sendet me an alle volgenden Objekte
		void sendTastaturAll( TastaturEreignis *te ) const; // sendet te an alle volgenden Objekte
		void sendMaus( MausEreignis *me ) const; // sendet me an dieses Objekt
		void sendTastatur( TastaturEreignis *te ) const; // sendet te an dieses Objekt
		void sendMaus( int i, MausEreignis *me ) const; // sendet me an das i-te Objekt
		void sendTastatur( int i, TastaturEreignis *te ) const; // sendet te an das i-te Objekt
		void render( Bild *rObj ); // Zeichnet alle nach rObj
		void render( int xOff, int yOff, int bOff, int hOff, Bild *rObj ); // Zeichnet alle nach rObj
		void tick( double tickval ); // tick
	};
}

#endif