#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
    {
    private:
        RCArray< Text > *typeName;
        RCArray< Text > *type;
        int fileIndex;
        int ref;

    public:
        // Konstruktor
        __declspec( dllexport ) DateiDialog();
        // Destruktor
        __declspec( dllexport ) ~DateiDialog();
        // L�scht die Liste mit zugelassenen Dateitypen
        __declspec( dllexport ) void removeDateiTypen();
        // F�gt einen zugelassenen Dateityp hinzu
        //  name: Der Name des Dateitypes. Ist f�r den Nutzer in der Select Box sichtbar
        //  typ: Der Dateityp, der ausgew�hlt werden darf
        __declspec( dllexport ) void addDateiTyp( char *name, char *typ );
        // F�gt einen zugelassenen Dateityp hinzu
        //  name: Der Name des Dateitypes. Ist f�r den Nutzer in der Select Box sichtbar
        //  typ: Der Dateityp, der ausgew�hlt werden darf
        __declspec( dllexport ) void addDateiTyp( Text *name, Text *typ );
        // Setzt den zu Beginn ausgew�hlten Dateityp
        //  i: Der Index des Dateityps. Der, der als erstes hinzugef�gt wurde, hat den Index 0.
        __declspec( dllexport ) void setDateiTypAuswahl( int i );
        // Zeigt den Dateidialog an
        //  open: true, wenn der Dialog zum �ffnen dienen soll. false zum Speichern
        //  return: Den Pfad zur ausgew�hlten Datei
        __declspec( dllexport ) Text *anzeigen( bool open ) const;
        // Erh�ht den Reference Counting Z�hler.
        //  return: this.
        __declspec( dllexport ) DateiDialog *getThis();
        // Verringert den Reference Counting Z�hler. Wenn der Z�hler 0 erreicht, wird das Zeichnung automatisch gel�scht.
        //  return: 0.
        __declspec( dllexport ) DateiDialog *release();
    };

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

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

#endif