#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 );
}