#pragma once

#include "Zeichnung.h"
#include "Trie.h"
#include "Array.h"
#include "UIInitialization.h"

/*
  KSG UIML Standart
  possible XML elements: 
    uimlview (the root element of uiml),
    class (only as direct child of uimlview),
    textfield, 
    button, 
    text,
    textarea,
    table (allowed child elements: tr), 
    tr (allowed child elements: textfield, button, table, text, textarea, frame),
    frame (allowed child elements: textfield, button, table, text, textarea, frame).
  possible global XML attributes: 
    id (string should be unique), 
    x (integer, optional % char at end), 
    y (integer, optional % char at end), 
    width (integer, optional % char at end), 
    height (integer, optional % char at end), 
    margin (integer, optional % char at end),
    margin-left (integer, optional % char at end), 
    margin-top (integer, optional % char at end), 
    margin-right (integer, optional % char at end), 
    margin-bottom (integer, optional % char at end),
    align-left (string (id values of other elements or keywords: start, end)),
    align-top (string (id values of other elements or keywords: start, end)),
    align-bottom ((string (id values of other elements or keywords: start, end)),
    align-right (string (id values of other elements or keywords: start, end)),
    tooltip (string),
    style (hex __int64),
    class (string (id of class element))

    attribute die sich gegenseitig ausschlie�en:
    align-left / align-right
    align-top / align-bottom

  spezific attributes:
     font-size (textfield, text, textarea, button)
     text-align (textfield, text, textarea)
     text-align-horizontal (textfield, text, textarea)
     text-align-vertical (textfield, text, textarea)

  example:
    <view>
      <textfield id="element_at_top_left" align-left="start", align-top="start", margin-left="5", margin-top="5" width="90%" height="30"/>
      <table id="element_below_textfield" align-left="start", aliign-top="element_at_top_left", margin-left="5", margin-top="5" width="90%" height="300">
        <tr>
          <button id="a_button_in_a_table"/>
          <textfield id="a_textfield_in_a_table"/>
        </tr>
      </table>
    </view>
*/

namespace Framework
{
    class Text;
    class ObjTabelle;
    class Schrift;
    class Bildschirm;

    namespace XML
    {
        class Element;
    }

    class UIMLView : public ZeichnungHintergrund
    {
    private:
        UIInit init;
        Trie< Zeichnung > *members;
        XML::Element *dom;
        int nextId;
        void parseTable( Iterator<XML::Element*> childs, ObjTabelle *table );
        void parseFrame( Iterator<XML::Element*> childs, Fenster *frame );
        Zeichnung *parseElement( XML::Element *e );
        void layout( XML::Element *e, int pWidth, int pHeight );

    public:
        // Erstellt eine UIML View
        __declspec( dllexport ) UIMLView();
        // Erstellt eine UIML View zu einem UIML Text
        //  uiml: Ein xml element gem�t des KSG UIML standarts
        //  screen: Ein zeiger f�r den Belschirm auf dem die tooltips angezeigt werden sollen
        //  schrift: Die schrift mit der der Text gezeichnet werden soll
        __declspec( dllexport ) UIMLView( XML::Element *uiml, UIInit &init );
        // Erstellt eine UIML View zu einem UIML Text
        //  uiml: Ein xml text gem�t des KSG UIML standarts
        //  screen: Ein zeiger f�r den Belschirm auf dem die tooltips angezeigt werden sollen
        //  schrift: Die schrift mit der der Text gezeichnet werden soll
        __declspec( dllexport ) UIMLView( Text uiml, UIInit &init );
        __declspec( dllexport ) ~UIMLView();
        // setzt den inhalt der view
        //  uiml: Ein xml element gem�t des KSG UIML standarts
        __declspec( dllexport ) void setUIML( XML::Element *uiml );
        // setzt den inhalt der view
        //  uiml: Ein xml text gem�t des KSG UIML standarts
        __declspec( dllexport ) void setUIML( Text uiml );
        // aktualisiert gr��e und position aller Zeichnungen gem�� den spezifikationen in UIML
        __declspec( dllexport ) void layout();
        // f�gt ein element hinzu
        //  uiml: Ein xml text gem�t des KSG UIML standarts, welcher das neue Objekt darstellt
        //  return: id des neuen Elements
        __declspec( dllexport ) Text addMember( Text uiml );
        // f�gt ein element zu einem Elternelement hinzu (funktioniert momentan nur mit frame Objekten)
        //  uiml: Ein xml text gem�t des KSG UIML standarts, welcher das neue Objekt darstellt
        //  return: id des neuen Elements
        __declspec( dllexport ) Text addMember( Text uiml, Text parentId );
        // entfernt ein element
        //  id: id des Elements
        __declspec( dllexport ) void removeMember( Text id );
        // Gibt eine zeichnung zur�ck, welche in uiml eine bestimmte id hat
        //  id: die id der Zeichnung
        __declspec( dllexport ) Zeichnung *zZeichnung( Text id );
        // Verarbeitet ein Maus Ereignis. Wird vom Framework automatisch aufgerufen.
        //  me: Das Ereignis
        __declspec( dllexport ) virtual void doMausEreignis( MausEreignis &me );
        // Verarbeitet ein Tastatur Ereignis. Wird vom Framework automatisch aufgerufen
        //  te: Das Ereignis
        __declspec( dllexport ) virtual void doTastaturEreignis( TastaturEreignis &te );
        // Updated den Zeichenhintergrund
        //  tickVal: Die vergangene Zeit in Sekunden, die seit dem Letzten Aufruf dieser Funktion verstrichen ist
        //  return: 1, wenn das Bild neu gezeichnet werden muss. 0 sonnst
        __declspec( dllexport ) bool tick( double tickVal ) override;
        // Zeichnet den Hintergrund eines Zeichnunges nach rObj
        __declspec( dllexport ) void render( Bild &rObj ) override;
        // Gibt den Dom Tree ohne erh�hten reference counter zur�ck
        // �nderungen am Dom Tree sollten vermieden werden (nur �nderungen von attributen einzelner elemente sind erlaubt)
        __declspec( dllexport ) XML::Element *zDom() const;
        // Gibt den Dom Tree zur�ck
        // �nderungen am Dom Tree sollten vermieden werden (nur �nderungen von attributen einzelner elemente sind erlaubt)
        __declspec( dllexport ) XML::Element *getDom() const;
    };
}