#ifndef DateiDialog_H
#define DateiDialog_H

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

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

    void InitDialog();

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

    public:
        //! Konstruktor
        DLLEXPORT DateiDialog();
        //! Destruktor
        DLLEXPORT ~DateiDialog();
        //! Loescht die Liste mit zugelassenen Dateitypen
        DLLEXPORT void removeDateiTypen();
        //! Fuegt einen zugelassenen Dateityp hinzu
        //! \param name Der Name des Dateitypes. Ist fuer den Nutzer in der
        //! Select Box sichtbar \param typ Der Dateityp, der ausgewaehlt werden
        //! darf
        DLLEXPORT void addDateiTyp(const char* name, const char* typ);
        //! Fuegt einen zugelassenen Dateityp hinzu
        //! \param name Der Name des Dateitypes. Ist fuer den Nutzer in der
        //! Select Box sichtbar \param typ Der Dateityp, der ausgewaehlt werden
        //! darf
        DLLEXPORT void addDateiTyp(Text* name, Text* typ);
        //! Setzt den zu Beginn ausgewaehlten Dateityp
        //! \param i Der Index des Dateityps. Der, der als erstes hinzugefuegt
        //! wurde, hat den Index 0.
        DLLEXPORT void setDateiTypAuswahl(int i);
        //! Zeigt den Dateidialog an
        //! \param open true, wenn der Dialog zum oeffnen dienen soll. false zum
        //! Speichern \return Den Pfad zur ausgewaehlten Datei
        DLLEXPORT Text* anzeigen(bool open) const;
    };

    //! Verwaltet einen Datei oeffnen/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 oeffnen oder speichern ist
        //! \param b 1, wenn er zum oefnen ist. 0, wenn er zum speichern ist
        DLLEXPORT void setOpen(bool b);
        //! Loescht die liste mit erlaubten Dateitypen
        DLLEXPORT void removeDateiTypen();
        //! Fuegt einen zugelassenen Dateityp hinzu
        //! \param name Der Name des Dateitypes. Ist fuer den Nutzer in der
        //! Select Box sichtbar \param typ Der Dateityp, der ausgewaehlt werden
        //! darf
        DLLEXPORT void addDateiTyp(const char* name, const char* typ);
        //! Fuegt einen zugelassenen Dateityp hinzu
        //! \param name Der Name des Dateitypes. Ist fuer den Nutzer in der
        //! Select Box sichtbar \param typ Der Dateityp, der ausgewaehlt werden
        //! darf
        DLLEXPORT void addDateiTyp(Text* name, Text* typ);
        //! Setzt den zu Beginn ausgewaehlten Dateityp
        //! \param i Der Index des Dateityps. Der, der als erstes hinzugefuegt
        //! 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 zurueck.
        //! Funktioniert erst, nachdem der Thread beendet wurde
        DLLEXPORT Text* getPfad() const;
        //! Gibt den Pfad zur Datei ohne erhoehten Reference Counter zurueck.
        //! Funktioniert erst, nachdem der Thread beendet wurde
        DLLEXPORT Text* zPfad() const;
    };
}; // namespace Framework

#endif