#ifndef Globals_H
#define Globals_H

#include "Critical.h"
#include "Punkt.h"

#ifdef WIN32
#    include "Maus.h"
#endif

#ifndef Global
#    define Global extern
#endif

struct HINSTANCE__; //! windows.h

namespace Framework
{
    class ThreadRegister; //! Thread.h
    class Thread;         //! Thread.h
    class Model3DList;    //! Model3DList.h
    class TexturList;     //! TexturList.h
    class Datei;          //! Datei.h
    class DLLRegister;    //! DLLRegister.h

    namespace Logging
    {
        class LoggingHandler; //! LoggingHandler.h
    }

#ifdef WIN32
    class Maus;          //! Maus.h
    class WFensterArray; //! Fenster.h

    Global WFensterArray WFensterA;
    Global bool MausTrack;
    Global Maus MausZeiger;
    Global bool msgExit;
#endif
    Global bool MausStand[3];
    Global bool istInitialisiert;
    Global ThreadRegister* thRegister;
    Global Critical logC;
    Global HINSTANCE__* _hinst;
    Global DLLRegister* dlls;
    Global bool debugDX;
    Global bool cursorVisible;
    Global Logging::LoggingHandler* loggingHandler;

#ifdef WIN32
    //! Gibt die Koordinaten der Maus auf dem Bildschirm zurueck
    DLLEXPORT Punkt getMausPos();
    //! Setzt die Position der Maus auf dem Bildschirm
    DLLEXPORT void setMausPos(const Punkt& pos);
#endif
    //! Gibt zurueck, ob eine Taste der Maus momentan gedrueckt wird
    //! \param taste Die Taste, die geprueft werden soll
    //! Beispiel: getMausStand( M_Links ); (Benoetigt include <MausEreignis.h>
    DLLEXPORT bool getMausStand(int taste);
    //! Gibt zurueck, ob eine Taste auf der tastatur momentan gedrueckt wird
    //! \param taste Die Taste, die ueberprueft werden soll
    //! Beispiel: getTastenStand( T_Enter ); (Benoetogt include
    //! <TastaturEreignis.h>
    DLLEXPORT bool getTastenStand(unsigned char taste);
    //! Initialisiert das Framework
    //! Wird in der (WinMain) des Frameworks automatisch aufgerufen
    DLLEXPORT void initFramework(HINSTANCE__* hInst = 0);
    //! Gibt den duch (initFramework) benutzten Arbeitsspeicher wieder frei
    //! Wird in der (WinMain) des Frameworks automatisch aufgerufen
    DLLEXPORT void releaseFramework();
    //! UEberprueft, ob ein bestimmter Zeiger auf ein Gueltiges Thread Objekt zeigt
    //! \param t Der zeiger, der ueberprueft werden soll
    //! \return 1, falls der Zeiger in Ordnung ist. 0, falls der Zeiger auf kein
    //! existentes Thread Objekt zeigt
    DLLEXPORT bool istThreadOk(Thread* t);
    //! Gibt das Thread Register des Frameworks zurueck
    DLLEXPORT ThreadRegister* getThreadRegister();
    //! Gibt das DLL Register zurueck, in dem alle zurzeit dynamisch geladenen
    //! DLL Dateien hinterlegt sind
    DLLEXPORT DLLRegister* getDLLRegister();
    //! Versetzt DirectX in den Debug modus
    DLLEXPORT void setDebugDX(bool debug);
#ifdef WIN32
    //! gibt eine Referenz auf die Maus zurueck
    DLLEXPORT Maus& getMaus();
    //! setzt den Zustand der Maus auf sichtbar oder unsichtbar
    DLLEXPORT void setShowCursor(bool visible);
#endif
} // namespace Framework

#endif