#pragma once

#include <Liste.h>
#include <Bild.h>
#include <Knopf.h>
#include <DateiDialog.h>
#include <Fenster.h>
#include <AuswahlBox.h>
#include <M2DVorschau.h>
#include "KEDModel2DEditor.h"
#include <GSLSoundV.h>

using namespace Framework;

class KEDBildSeite
{
private:
    AuswahlListe *bilder;
    BildO *bildObj;
    Knopf *bildLöschen;
    Knopf *importieren;
    Knopf *dateiLöschen;
    Knopf *neueDatei;
    DateiDialogTh *importDialog;
    Text *importPfad;
    int aktion;
    bool sichtbar;
    unsigned char alpha;
    unsigned char alpha2;
    double tickVal;
    int ref;

public:
    // Konstruktor
    KEDBildSeite( Schrift *zSchrift, Knopf *zNeueDatei, Knopf *zDateiLöschen );
    // Destruktor
    ~KEDBildSeite();
    // nicht constant
    int getAktion();
    void setBildListe( RCArray< Text > *list );
    void setBild( Bild *b );
    void setSichtbar( bool s );
    bool tick( double tv );
    void doMausEreignis( MausEreignis &me );
    void render( Bild &zRObj );
    // constant
    Text *zBildImportPfad() const;
    Text *zBildAuswahl() const;
    // Reference Counting
    KEDBildSeite *getThis();
    KEDBildSeite *release();
};

class KEDModellSeite
{
private:
    AuswahlListe *modelle;
    M2DVorschau *modelObj;
    Knopf *modelLöschen;
    Knopf *neuesModel;
    Knopf *dateiLöschen;
    Knopf *neueDatei;
    Knopf *bearbeiten;
    Model2DEditor::GUI *editor;
    Fenster *neuModelF;
    TextFeld *neuModelName;
    Knopf *neuModelOk;
    AuswahlListe *dateien;
    int aktion;
    bool sichtbar;
    unsigned char alpha;
    unsigned char alpha2;
    unsigned char alpha3;
    double tickVal;
    int ref;

public:
    // Konstruktor
    KEDModellSeite( Schrift *zSchrift, Knopf *zNeueDatei, Knopf *zDateiLöschen, AuswahlListe *dateien );
    // Destruktor
    ~KEDModellSeite();
    // nicht constant
    int getAktion();
    bool neuModelOkME( MausEreignis &me );
    void setModelListe( RCArray< Text > *list );
    void setModel( Model2DData *mdl );
    void setSichtbar( bool s );
    bool tick( double tv );
    void doMausEreignis( MausEreignis &me );
    void doTastaturEreignis( TastaturEreignis &me );
    void render( Bild &zRObj );
    // constant
    Text *zModelAuswahl() const;
    Text *zNeuModelName() const;
    Model2DData *getModelData() const;
    // Reference Counting
    KEDModellSeite *getThis();
    KEDModellSeite *release();
};

class KEDSoundSeite
{
private:
    AuswahlListe *sounds;
    GSL::GSLSoundV *sound;
    Knopf *soundLöschen;
    Knopf *importieren;
    Knopf *dateiLöschen;
    Knopf *neueDatei;
    Knopf *play;
    DateiDialogTh *importDialog;
    Text *importPfad;
    int aktion;
    bool sichtbar;
    unsigned char alpha;
    unsigned char alpha2;
    double tickVal;
    int ref;

public:
    // Konstruktor
    KEDSoundSeite( Schrift *zSchrift, Knopf *zNeueDatei, Knopf *zDateiLöschen );
    // Destruktor
    ~KEDSoundSeite();
    // nicht constant
    int getAktion();
    void setSoundListe( RCArray< Text > *list );
    void setSound( GSL::GSLSoundV *b );
    void setSichtbar( bool s );
    bool tick( double tv );
    void doMausEreignis( MausEreignis &me );
    void render( Bild &zRObj );
    // constant
    Text *zSoundImportPfad() const;
    Text *zSoundAuswahl() const;
    // Reference Counting
    KEDSoundSeite *getThis();
    KEDSoundSeite *release();
};

class KEDEditor : public Zeichnung
{
private:
    AuswahlListe *dateien;
    KEDBildSeite *bildSeite;
    KEDModellSeite *modelSeite;
    KEDSoundSeite *soundSeite;
    Fenster *neuDateiF;
    AuswahlBox *neuDateiTyp;
    TextFeld *neuDateiName;
    Knopf *neuDateiOk;
    Knopf *neueDatei;
    Knopf *dateiLöschen;
    int aktion;
    bool sichtbar;
    unsigned char alpha;
    unsigned char alpha2;
    double tickVal;
    int ref;

public:
    // Konstruktor
    KEDEditor( Schrift *zSchrift );
    // Destruktor
    ~KEDEditor();
    // nicht constant
    int getAktion();
    bool neuDateiOkME( MausEreignis &me );
    void setDateiListe( RCArray< Text > *list );
    void setBildListe( RCArray< Text > *list );
    void setSoundListe( RCArray< Text > *list );
    void setModel2dListe( RCArray< Text > *list );
    void setBild( Bild *b );
    void setSound( GSL::GSLSoundV *s );
    void setModel2d( Model2DData *d );
    void setSichtbar( bool s );
    bool tick( double tv ) override;
    void doMausEreignis( MausEreignis &me ) override;
    void doTastaturEreignis( TastaturEreignis &te ) override;
    void render( Bild &zRObj ) override;
    // constant
    Text *zBildImportPfad() const;
    Text *zSoundImportPfad() const;
    Text *zDateiAuswahl() const;
    Text *zBildAuswahl() const;
    Text *zSoundAuswahl() const;
    Text *zModel2dAuswahl() const;
    Model2DData *getModelData() const;
    Text *zNeuModelName() const;
    int getNeuDateiTyp() const;
    Text *zNeuDateiName() const;
    bool istSichtbar() const;
    // Reference Counting
    KEDEditor *getThis();
    KEDEditor *release();
};