#pragma once

#include <functional>
#include "Betriebssystem.h"

namespace Framework
{
    class AuswahlBox;
    class AuswahlListe;
    class BildZ;
    class FBalken;
    class Kamera2D;
    class Fenster;
    class Knopf;
    class KontrollKnopf;
    class LDiag;
    class M2DVorschau;
    class Model2D;
    class Animation2D;
    class TextFeld;
    class ObjTabelle;
    class SLDiag;
    class UIMLView;
    class Schrift;
    class Bildschirm;

    struct UIInitParam
    {
        Schrift *schrift;
        Bildschirm *bildschirm;
        void *data;
    };

    struct UIInit
    {
        UIInitParam initParam;
        std::function< AuswahlBox *( UIInitParam &p ) > createAuswahlBox;
        std::function< AuswahlListe *( UIInitParam &p ) > createAuswahlListe;
        std::function< BildZ *( UIInitParam &p ) > createBildZ;
        std::function< FBalken *( UIInitParam &p ) > createFBalken;
        std::function< Kamera2D *( UIInitParam &p ) > createKamera2D;
        std::function< Fenster *( UIInitParam &p ) > createFenster;
        std::function< Knopf *( UIInitParam &p ) > createKnopf;
        std::function< KontrollKnopf *( UIInitParam &p ) > createKontrollKnopf;
        std::function< LDiag *( UIInitParam &p ) > createLDiag;
        std::function< M2DVorschau *( UIInitParam &p ) > createM2DVorschau;
        std::function< Model2D *( UIInitParam &p ) > createModel2D;
        std::function< Animation2D *( UIInitParam &p ) > createAnimation2D;
        std::function< TextFeld *( UIInitParam &p ) > createTextFeld;
        std::function< ObjTabelle *( UIInitParam &p ) > createObjTabelle;
        std::function< SLDiag *( UIInitParam &p ) > createSLDiag;
        std::function< UIMLView *( UIInitParam &p ) > createUIMLView;
    };

    //! gibt eine liste mit default initialisierungsfunktionen zurück
    //! \param zSchrift Die schrift die verwendet werden soll (ohne erhöhten reference Counter)
    //! \param zScreen Der Bildschirm der verwendet werden soll (ohne erhöhten reference Counter)
    DLLEXPORT UIInit defaultUI( Schrift *zSchrift, Bildschirm *zScreen );
}