#include "UIDialog.h"
#include "UIInitialization.h"
#include "TextFeld.h"
#include "Schrift.h"
#include "Knopf.h"

using namespace Framework;

UIDialog::UIDialog( Schrift *schrift )
    : Fenster()
{
    addStyle( Fenster::Style::normal | Fenster::Style::BodyHintergrund | Fenster::Style::TitelHintergrund | Fenster::Style::ClosingHintergrund );
    setKBgFarbe( 0xFF000000 );
    setTBgFarbe( 0xFF000000 );
    setSBgFarbe( 0xFF000000 );
    setMausEreignis( _ret1ME );
    setTastaturEreignis( _ret1TE );
    setRBreite( 1 );
    setRFarbe( 0xFFFFFFFF );
    setTitel( "" );
    setTSchriftZ( schrift );
    setTSFarbe( 0xFFFFFFFF );
    zTTextFeld()->setSize( 0, 20 );
    zTTextFeld()->addStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center | TextFeld::Style::Rahmen );
    setTRFarbe( 0xFF00FF00 );
    setTRBreite( 1 );
    setTAfFarbe( 0x1000FF00 );
    setTAfStrength( -15 );
    setSKAfFarbe( 0xFF00FF00 );
    setSKAfStrength( 30 );
    setClosingMe( [this]( void *p, void *o, MausEreignis me )
    {
        if( me.id == ME_RLinks )
            removeStyle( Fenster::Style::Sichtbar );
        return 1;
    } );
}

UIDialog::~UIDialog()
{}

void UIDialog::adjustSize()
{
    Punkt max = Punkt( 0, 0 );
    for( auto m = getMembers(); m; m++ )
    {
        if( m->hatStyle( Zeichnung::Style::Sichtbar ) )
        {
            max.x = MAX( max.x, m->getX() + m->getBreite() + 5 );
            max.y = MAX( max.y, m->getY() + m->getHeight() + 5 );
        }
    }
    setSize( max + Punkt( hatStyle( Fenster::Style::Rahmen ) ? getRBreite() * 2 : 0,
                          ( hatStyle( Fenster::Style::Rahmen ) ? getRBreite() * 2 : 0 ) +
                          ( hatStyle( Fenster::Style::Titel ) ? zTTextFeld()->getHeight() : 0 ) ) );
}

// Fügt dem Fenster eine Zeichnung hinzu
//  obj: Die Zeichnung
void UIDialog::addMember( Zeichnung *obj )
{
    Fenster::addMember( obj );
    adjustSize();
}

// Entfernt eine Zeichnung aus dem Fenster
//  zObj: Die Zeichnung (ohne erhöhten reference Counter)
void UIDialog::removeMember( Zeichnung *zObj )
{
    Fenster::removeMember( zObj );
    adjustSize();
}

// Entfernt alle Zeichnungen aus dem Fenster
void UIDialog::removeAll()
{
    Fenster::removeAll();
    adjustSize();
}


UIMessageDialog::UIMessageDialog( const char *titel, const char *message, Schrift *schrift )
    : UIDialog( schrift )
{
    setTitel( titel );
    UIInit init = defaultUI( schrift, 0 );
    TextFeld *msg = init.createTextFeld( init.initParam );
    msg->setStyle( TextFeld::Style::Text );
    msg->setText( message );
    msg->setPosition( 5, 5 );
    TextRenderer tr( dynamic_cast<Schrift *>( schrift->getThis() ) );
    tr.textFormatieren( msg->zText(), 590 );
    int br = tr.getTextBreite( message );
    int hö = tr.getTextHeight( message );
    msg->setSize( br, hö );
    Knopf *ok = init.createKnopf( init.initParam );
    ok->setText( "Ok" );
    ok->setMausEreignis( [this]( void *p, void *o, MausEreignis me )
    {
        if( me.id == ME_RLinks )
            removeStyle( Fenster::Style::Sichtbar );
        return 1;
    } );
    ok->setPosition( br - 100, hö + 5 );
    ok->setSize( 100, 20 );
    addMember( ok );
    addMember( msg );
    setSize( br + 10, hö + 55 );
}

UIMessageDialog::~UIMessageDialog()
{}