#ifndef DateiDialog_H
#define DateiDialog_H

#include "Array.h"
#include "Thread.h"

namespace Framework
{
    class Text; //! Text.h

    void InitDialog();

    //! Erstellt einen Datei öffnen/speichern Dialog
    class DateiDialog : public virtual ReferenceCounter
    {
    private:
        RCArray<Text>* typeName;
        RCArray<Text>* type;
        int fileIndex;

    public:
        //! Konstruktor
        DLLEXPORT DateiDialog();
        //! Destruktor
        DLLEXPORT ~DateiDialog();
        //! Löscht die Liste mit zugelassenen Dateitypen
        DLLEXPORT void removeDateiTypen();
        //! Fügt einen zugelassenen Dateityp hinzu
        //! \param name Der Name des Dateitypes. Ist für den Nutzer in der
        //! Select Box sichtbar \param typ Der Dateityp, der ausgewählt werden
        //! darf
        DLLEXPORT void addDateiTyp(const char* name, const char* typ);
        //! Fügt einen zugelassenen Dateityp hinzu
        //! \param name Der Name des Dateitypes. Ist für den Nutzer in der
        //! Select Box sichtbar \param typ Der Dateityp, der ausgewählt werden
        //! darf
        DLLEXPORT void addDateiTyp(Text* name, Text* typ);
        //! Setzt den zu Beginn ausgewählten Dateityp
        //! \param i Der Index des Dateityps. Der, der als erstes hinzugefügt
        //! wurde, hat den Index 0.
        DLLEXPORT void setDateiTypAuswahl(int i);
        //! Zeigt den Dateidialog an
        //! \param open true, wenn der Dialog zum öffnen dienen soll. false zum
        //! Speichern \return Den Pfad zur ausgewählten Datei
        DLLEXPORT Text* anzeigen(bool open) const;
    };

    //! Verwaltet einen Datei öffnen/speichern Dialog ohne zu warten
    class DateiDialogTh : public Thread
    {
    private:
        DateiDialog* dialog;
        Text* ret;
        bool open;

    public:
        //! Konstruktor
        DLLEXPORT DateiDialogTh();
        //! Destruktor
        DLLEXPORT ~DateiDialogTh();
        //! Legt fest, ob der Dialog zum öffnen oder speichern ist
        //! \param b 1, wenn er zum öfnen ist. 0, wenn er zum speichern ist
        DLLEXPORT void setOpen(bool b);
        //! Löscht die liste mit erlaubten Dateitypen
        DLLEXPORT void removeDateiTypen();
        //! Fügt einen zugelassenen Dateityp hinzu
        //! \param name Der Name des Dateitypes. Ist für den Nutzer in der
        //! Select Box sichtbar \param typ Der Dateityp, der ausgewählt werden
        //! darf
        DLLEXPORT void addDateiTyp(const char* name, const char* typ);
        //! Fügt einen zugelassenen Dateityp hinzu
        //! \param name Der Name des Dateitypes. Ist für den Nutzer in der
        //! Select Box sichtbar \param typ Der Dateityp, der ausgewählt werden
        //! darf
        DLLEXPORT void addDateiTyp(Text* name, Text* typ);
        //! Setzt den zu Beginn ausgewählten Dateityp
        //! \param i Der Index des Dateityps. Der, der als erstes hinzugefügt
        //! wurde, hat den Index 0.
        DLLEXPORT void setDateiTypAuswahl(int i);
        //! Diese Funktion wird von der Klasse selbst aufgerufen.
        //! Benutze die start Funktion um den Dialog anzuzeigen
        DLLEXPORT void thread() override;
        //! Gibt den Pfad zur Datei zurück.
        //! Funktioniert erst, nachdem der Thread beendet wurde
        DLLEXPORT Text* getPfad() const;
        //! Gibt den Pfad zur Datei ohne erhöhten Reference Counter zurück.
        //! Funktioniert erst, nachdem der Thread beendet wurde
        DLLEXPORT Text* zPfad() const;
    };
}; // namespace Framework

#endif