#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*(const UIInitParam& p)> createAuswahlBox;
        std::function<AuswahlListe*(const UIInitParam& p)> createAuswahlListe;
        std::function<BildZ*(const UIInitParam& p)> createBildZ;
        std::function<FBalken*(const UIInitParam& p)> createFBalken;
        std::function<Kamera2D*(const UIInitParam& p)> createKamera2D;
        std::function<Fenster*(const UIInitParam& p)> createFenster;
        std::function<Knopf*(const UIInitParam& p)> createKnopf;
        std::function<KontrollKnopf*(const UIInitParam& p)> createKontrollKnopf;
        std::function<LDiag*(const UIInitParam& p)> createLDiag;
        std::function<M2DVorschau*(const UIInitParam& p)> createM2DVorschau;
        std::function<Model2D*(const UIInitParam& p)> createModel2D;
        std::function<Animation2D*(const UIInitParam& p)> createAnimation2D;
        std::function<TextFeld*(const UIInitParam& p)> createTextFeld;
        std::function<ObjTabelle*(const UIInitParam& p)> createObjTabelle;
        std::function<SLDiag*(const UIInitParam& p)> createSLDiag;
        std::function<UIMLView*(const 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);
} // namespace Framework