#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