#include "Initialisierung.h"
#include <ToolTip.h>
#include <Bildschirm.h>
#include <MausEreignis.h>
#include <DateiSystem.h>
#include "Variablen.h"

Knopf *initKnopf( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *titel )
{
	Knopf *ret = new Knopf();
	ret->addStyle( style );
	ret->setPosition( x, y );
	ret->setGröße( br, hö );
	if( zSchrift )
		ret->setSchriftZ( zSchrift->getThis() );
	ret->setText( titel );
	return ret;
}

KontrollKnopf *initKontrollKnopf( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *txt )
{
	KontrollKnopf *ret = new KontrollKnopf();
    ret->setMausEreignis( _ret1ME );
	ret->setStyle( style );
	ret->setSchriftZ( zSchrift->getThis() );
	ret->setText( txt );
	ret->setSText( txt );
	ret->setSFarbe( 0xFFFFFFFF );
	ret->setSGröße( 12 );
	if( ret->hatStyle( TextFeld::Style::Buffered ) )
	{
		ret->setAlphaFeldFarbe( 0x5500FF00 );
		ret->setAlphaFeldStärke( -5 );
	}
	if( ret->hatStyle( TextFeld::Style::Rahmen ) )
	{
		ret->setLinienRahmenBreite( 1 );
		ret->setLinienRahmenFarbe( 0xFF00FF00 );
	}
	ret->setPosition( x, y );
	ret->setGröße( br, hö );
	ret->loadData( "data/bilder/system.ltdb" );
	return ret;
}

Fenster *initFenster( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *titel )
{
	Fenster *ret = new Fenster();
    ret->setMausEreignis( _ret1ME );
    ret->setTastaturEreignis( _ret1TE );
	ret->setStyle( style );
	ret->setPosition( x, y );
	ret->setGröße( br, hö );
	if( ret->hatStyle( Fenster::Style::Rahmen ) )
	{
		ret->setRBreite( 1 );
		ret->setRFarbe( 0xFFFFFFFF );
	}
	if( ret->hatStyle( Fenster::Style::Titel ) )
	{
		ret->setTitel( titel );
		ret->setTSchriftZ( zSchrift->getThis() );
		ret->setTSFarbe( 0xFFFFFFFF );
		ret->zTTextFeld()->setGröße( 0, 20 );
		ret->zTTextFeld()->addStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center | TextFeld::Style::Rahmen );
		ret->setTRFarbe( 0xFF00FF00 );
		ret->setTRBreite( 1 );
		if( ret->hatStyle( Fenster::Style::TitelBuffered ) )
		{
			ret->setTAfFarbe( 0x1000FF00 );
			ret->setTAfStärke( -15 );
		}
	}
    if( ret->hatStyle( Fenster::Style::Schließbar ) )
    {
        if( ret->hatStyle( Fenster::Style::SchließKlickBuffer ) )
        {
            ret->setSKAfFarbe( 0xFF00FF00 );
            ret->setSKAfStärke( 30 );
        }
    }
	return ret;
}

TextFeld *initTextFeld( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *txt )
{
    TextFeld *ret = new TextFeld();
    ret->setStyle( style );
    ret->setSchriftZ( zSchrift->getThis() );
    ret->setText( txt );
    ret->setSchriftFarbe( 0xFFFFFFFF );
    ret->setSchriftGröße( 12 );
    if( ret->hatStyle( TextFeld::Style::Buffered ) )
    {
        ret->setAlphaFeldFarbe( 0x5500FF00 );
        ret->setAlphaFeldStärke( -5 );
    }
    if( ret->hatStyle( TextFeld::Style::Rahmen ) )
    {
        ret->setLinienRahmenBreite( 1 );
        ret->setLinienRahmenFarbe( 0xFF00FF00 );
    }
    ret->setPosition( x, y );
    ret->setGröße( br, hö );
    return ret;
}

BildO *initBildO( int x, int y, int br, int hö, __int64 style, Bild *b )
{
	BildO *ret = new BildO();
	ret->setStyle( style );
	ret->setPosition( x, y );
	ret->setGröße( br, hö );
	if( b )
		ret->setBildZ( b );
	if( ( style | BildO::Style::Rahmen ) == style )
	{
		ret->setLinienRahmenBreite( 1 );
		ret->setLinienRahmenFarbe( 0xFFFFFFFF );
	}
	return ret;
}

AuswahlBox *initAuswahlBox( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, std::initializer_list< char * > values )
{
	AuswahlBox *ret = new AuswahlBox();
	ret->setStyle( style );
	ret->setPosition( x, y );
	ret->setGröße( br, hö );
	if( ( style | AuswahlBox::Style::Hintergrund ) == style )
		ret->setHintergrundFarbe( 0xFF000000 );
	if( ( style | AuswahlBox::Style::Erlaubt ) == style )
		ret->setMausEreignis( _ret1ME );
	if( zSchrift )
		ret->setSchriftZ( zSchrift->getThis() );
	if( ( style | AuswahlBox::Style::Rahmen ) == style )
	{
		ret->setLinienRahmenBreite( 1 );
		ret->setLinienRahmenFarbe( 0xFFFFFFFF );
	}
	if( ( style | AuswahlBox::Style::MaxHöhe ) == style )
		ret->setMaxAuskappHöhe( 100 );
	if( ( style | AuswahlBox::Style::MausRahmen ) == style )
	{
		ret->setMausRahmenBreite( 1 );
		ret->setMausRahmenFarbe( 0xFF005500 );
	}
	if( ( style | AuswahlBox::Style::MausBuffer ) == style )
	{
		ret->setMausAlphaFeldFarbe( 0x00008700 );
		ret->setMausAlphaFeldStärke( -8 );
	}
	if( ( style | AuswahlBox::Style::AuswahlRahmen ) == style )
	{
		ret->setAuswRahmenBreite( 1 );
		ret->setAuswRahmenFarbe( 0xFF00FF00 );
	}
	if( ( style | AuswahlBox::Style::AuswahlBuffer ) == style )
	{
		ret->setAuswAlphaFeldFarbe( 0x0000FF00 );
		ret->setAuswAlphaFeldStärke( -8 );
	}
	for( auto i = values.begin(); i != values.end(); i++ )
		ret->addEintrag( *i );
	return ret;
}

ObjTabelle *initObjTabelle( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, std::initializer_list< OBJTabelleSpalteIni > spalten, int überschriftHöhe )
{
	ObjTabelle *ret = new ObjTabelle();
	ret->setStyle( style );
	ret->setPosition( x, y );
	ret->setGröße( br, hö );
	if( ( style | ObjTabelle::Style::Erlaubt ) == style )
		ret->setMausEreignis( _ret1ME );
	if( ( style | ObjTabelle::Style::Rahmen ) == style )
	{
		ret->setLinienRahmenBreite( 1 );
		ret->setLinienRahmenFarbe( 0xFFFFFFFF );
	}
	if( ( style | ObjTabelle::Style::Raster ) == style )
	{
		ret->setRasterBreite( 1 );
		ret->setRasterFarbe( 0xFFFFFFFF );
	}
	if( ( style | ObjTabelle::Style::VScroll ) == style )
		ret->setVertikalKlickScroll( 5 );
	if( ( style | ObjTabelle::Style::HScroll ) == style )
		ret->setHorizontalKlickScroll( 5 );
	for( auto i = spalten.begin(); i != spalten.end(); i++ )
	{
		ret->addSpalte( i->name );
		ret->setSpaltenBreite( i->name, i->breite );
		if( ( style | ObjTabelle::Style::SpaltenBreiteMin ) == style )
			ret->setMinSpaltenBreite( i->name, i->minBreite );
		if( ( style | ObjTabelle::Style::SpaltenBreiteMax ) == style )
			ret->setMaxSpaltenBreite( i->name, i->maxBreite );
		if( überschriftHöhe )
		{
			if( ret->getZeilenNummer( "Überschrift" ) < 0 )
			{
				ret->addZeile( 0, "Überschrift" );
				ret->setZeilenHöhe( 0, 20 );
			}
			ret->setZeichnungZ( i->name, "Überschrift", initTextFeld( 0, 0, i->breite, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, i->name ) );
		}
	}
	return ret;
}

LDiag *initLinienDiagramm( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, DiagDaten *data )
{
	LDiag *ret = new LDiag();
	ret->setStyle( style );
	ret->setPosition( x, y );
	ret->setGröße( br, hö );
	if( zSchrift )
	{
		ret->setSchriftZ( zSchrift->getThis() );
		ret->setSchriftGröße( 12 );
	}
	if( data )
		ret->setDiagDatenZ( data );
	if( ret->hatStyle( LDiag::Style::Rahmen ) )
	{
		ret->setLinienRahmenBreite( 1 );
		ret->setLinienRahmenFarbe( 0xFFFFFFFF );
	}
	if( ret->hatStyle( LDiag::Style::DatenRahmen ) )
	{
		ret->setDatenRahmenBreite( 1 );
		ret->setDatenRahmenFarbe( 0xFFFFFFFF );
	}
	if( ret->hatStyle( LDiag::Style::Hintergrund ) )
		ret->setHintergrundFarbe( 0xFF000000 );
	if( ret->hatStyle( LDiag::Style::DatenHintergrund ) )
		ret->setHintergrundFarbe( 0xFF000000 );
	return ret;
}

FBalken *initFBalken( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style )
{
	FBalken *ret = new FBalken();
	ret->setStyle( style );
	ret->setPosition( x, y );
	ret->setGröße( br, hö );
	if( zSchrift )
	{
		ret->setSchriftZ( zSchrift->getThis() );
		ret->setSFarbe( 0xFFFFFFFF );
		ret->setSGröße( 12 );
	}
	if( ret->hatStyle( FBalken::Style::Rahmen ) )
	{
		ret->setLinienRahmenFarbe( 0xFFFFFFFF );
		ret->setLinienRahmenBreite( 1 );
	}
	if( ret->hatStyle( FBalken::Style::HBild ) )
	{
		Bild *fbhb = bilder->get( "system.ltdb/fortschritt lehr.png" );
		if( !fbhb )
		{
			LTDBDatei *datei = new LTDBDatei();
			datei->setDatei( new Text( "data/bilder/system.ltdb" ) );
			datei->leseDaten( 0 );
			fbhb = datei->laden( 0, new Text( "fortschrittleh" ) );
			datei->release();
			bilder->add( "system.ltdb/fortschritt lehr.png", fbhb->getThis() );
		}
		ret->setHintergrundBildZ( fbhb );
	}
	if( ret->hatStyle( FBalken::Style::FBild ) )
	{
		Bild *fbfhb = bilder->get( "system.ltdb/fortschritt voll.png" );
		if( !fbfhb )
		{
			LTDBDatei *datei = new LTDBDatei();
			datei->setDatei( new Text( "data/bilder/system.ltdb" ) );
			datei->leseDaten( 0 );
			fbfhb = datei->laden( 0, new Text( "fortschrittvol" ) );
			datei->release();
			bilder->add( "system.ltdb/fortschritt voll.png", fbfhb->getThis() );
		}
		ret->setFBgBildZ( fbfhb );
	}
	else if( ret->hatStyle( FBalken::Style::FFarbe ) )
		ret->setFBgFarbe( 0xFF00FF00 );
	return ret;
}

AuswahlListe *initAuswahlListe( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, std::initializer_list< char * > values )
{
    AuswahlListe *ret = new AuswahlListe();
    ret->setPosition( x, y );
    ret->setGröße( br, hö );
    ret->setStyle( style );
    ret->setSchriftZ( zSchrift->getThis() );
    if( ret->hatStyle( AuswahlListe::Style::Buffered ) )
    {
        ret->setAlphaFeldFarbe( 0x5500FF00 );
        ret->setAlphaFeldStärke( -5 );
    }
    if( ret->hatStyle( AuswahlListe::Style::Rahmen ) )
    {
        ret->setLinienRahmenBreite( 1 );
        ret->setLinienRahmenFarbe( 0xFFFFFFFF );
    }
    if( ( style | AuswahlListe::Style::Hintergrund ) == style )
        ret->setHintergrundFarbe( 0xFF000000 );
    if( ( style | AuswahlListe::Style::Erlaubt ) == style )
        ret->setMausEreignis( _ret1ME );
    if( ( style | AuswahlListe::Style::AuswahlRahmen ) == style )
    {
        ret->setALRBreite( 1 );
        ret->setALRFarbe( 0xFF00FF00 );
    }
    if( ( style | AuswahlListe::Style::AuswahlBuffer ) == style )
    {
        ret->setAAFFarbe( 0x0000FF00 );
        ret->setAAFStärke( -8 );
    }
    for( auto i = values.begin(); i != values.end(); i++ )
        ret->addEintrag( *i );
    ret->update();
    return ret;
}

ZeichnungHintergrund *initZeichnungHintergrund( int x, int y, int br, int hö, __int64 style, int farbe )
{
    ZeichnungHintergrund *ret = new ZeichnungHintergrund();
    ret->setStyle( style );
    ret->setHintergrundFarbe( farbe );
    if( ret->hatStyle( ZeichnungHintergrund::Style::Rahmen ) )
    {
        ret->setLinienRahmenBreite( 1 );
        ret->setLinienRahmenFarbe( 0xFF00FF00 );
    }
    ret->setPosition( x, y );
    ret->setGröße( br, hö );
    return ret;
}

void initToolTip( Zeichnung *obj, const char *txt, Schrift *schrift, Bildschirm *zBs )
{
	obj->setToolTipText( txt , zBs );
	obj->zToolTip()->setSchriftZ( schrift );
	obj->zToolTip()->addStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Hintergrund | TextFeld::Style::HAlpha | TextFeld::Style::Mehrzeilig );
	obj->zToolTip()->setHintergrundFarbe( 0xA0000000 );
	obj->zToolTip()->setLinienRahmenFarbe( 0xFFFFFFFF );
	obj->zToolTip()->setSchriftFarbe( 0xFFFFFFFF );
}