#include "KSGSTextFeld.h"
#include "KSGSTyp.h"
#include "../Error/Error.h"
#include "KSGSBool.h"
#include "KSGSText.h"
#include "KSGSBild.h"
#include "KSGSInt.h"
#include "KSGSBool.h"
#include "../Main/KSGScriptObj.h"
#include "KSGSMausEreignis.h"
#include "KSGSTastaturEreignis.h"
#include <ToolTip.h>

using namespace KSGScript;

// Inhalt der KSGSTextFeldKlasse Klasse aus KSGSTextFeld.h
// Konstruktor
KSGSTextFeldKlasse::KSGSTextFeldKlasse( KSGScriptObj *zObj, TextFeld *std )
	: KSGSKlasseInstanz( KSGS_TEXTFELD, 0, 0, zObj )
{
	val = std;
	mausF = -1;
	tastaturF = -1;
	val->setMausEreignisParameter( this );
	val->setMausEreignis( ksgsTextFeldME );
	val->setTastaturEreignisParameter( this );
	val->setTastaturEreignis( ksgsTextFeldTE );
	if( zObj->zSchrift() )
	    val->setSchriftZ( zObj->getSchrift() );
}

// Destruktor
KSGSTextFeldKlasse::~KSGSTextFeldKlasse()
{
	val->release();
}

// nicht constant
KSGSVariable *KSGSTextFeldKlasse::startFunktion( int id, bool access, RCArray< KSGSVariable > *parameter )
{
	KSGSVariable *ret = 0;
	switch( id )
	{
	case 0: // void setText( Text )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		val->setText( parameter->z( 0 ) ? parameter->z( 0 )->getText() : new Text() );
		break;
	case 1: // void addZeile( Text )
		if( 1 )
		{
			if( parameter->getEintragAnzahl() < 1 )
				error( 20, {}, obj );
			Text *txt = parameter->z( 0 ) ? parameter->z( 0 )->getText() : new Text();
			val->addZeile( *txt );
			txt->release();
		}
		break;
	case 2: // void setAuswahl( int, int )
		if( parameter->getEintragAnzahl() < 2 )
			error( 20, {}, obj );
		val->setAuswahl( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0,
						 parameter->z( 1 ) ? parameter->z( 1 )->getInt() : 0 );
		break;
	case 3: // void setHintergrundBild( Bild )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		val->setHintergrundBildZ( parameter->z( 0 ) ? parameter->z( 0 )->getBild() : 0 );
		break;
	case 4: // void setHintergrundFarbe( int )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		val->setHintergrundFarbe( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0 );
		break;
	case 5: // void setSchriftGr��e( int )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		val->setSchriftSize( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0 );
		break;
	case 6: // void setSchriftFarbe( int )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		val->setSchriftFarbe( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0 );
		break;
	case 7: // void setAFSt�rke( int )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		val->setAlphaFeldStrength( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0 );
		break;
	case 8: // void setAFFarbe( int )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		val->setAlphaFeldFarbe( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0 );
		break;
	case 9: // void setLRBreite( int )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		val->setLinienRahmenBreite( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0 );
		break;
	case 10: // void setLRFarbe( int )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		val->setLinienRahmenFarbe( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0 );
		break;
	case 11: // void setShowChar( int )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		val->setSchowChar( (char)( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0 ) );
		break;
	case 12: // void setVKlickScroll( int )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		val->setVertikalKlickScroll( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0 );
		break;
	case 13: // void setVScrollPos( int )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		val->setVertikalScrollPos( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0 );
		break;
	case 14: // void setVScrollZuZeile( int )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		val->setVScrollZuZeile( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0 );
		break;
	case 15: // void updateVScroll()
		val->updateVScroll();
		break;
	case 16: // void setStyle( int )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		val->setStyle( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0 );
		break;
	case 17: // void addStyle( int )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		val->addStyle( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0 );
		break;
	case 18: // void l�scheStyle( int )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		val->removeStyle( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0 );
		break;
	case 19: // bool tick( double )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		ret = new KSGSBoolKlasse( obj, val->tick( parameter->z( 0 ) ? parameter->z( 0 )->getDouble() : 0 ) );
		break;
	case 20: // void setMausEreignis( Text )
		if( 1 )
		{
			if( parameter->getEintragAnzahl() < 1 )
				error( 20, {}, obj );
			Text *n = parameter->z( 0 ) ? parameter->z( 0 )->getText() : 0;
			if( n )
			{
				mausF = obj->getFunktionId( *n );
				n->release();
			}
			else
				mausF = -1;
		}
		break;
	case 21: // void setTastaturEreignis( Text )
		if( 1 )
		{
			if( parameter->getEintragAnzahl() < 1 )
				error( 20, {}, obj );
			Text *n = parameter->z( 0 ) ? parameter->z( 0 )->getText() : 0;
			if( n )
			{
				tastaturF = obj->getFunktionId( *n );
				n->release();
			}
			else
				tastaturF = -1;
		}
		break;
	case 22: // void doMausEreignis( MausEreignis )
		if( 1 )
		{
			if( parameter->getEintragAnzahl() < 1 )
				error( 20, {}, obj );
			MausEreignis me = parameter->z( 0 ) ? parameter->z( 0 )->getMausEreignis() : MausEreignis{ 0, 0, 0, 0, 0, 0 };
			val->doMausEreignis( me );
		}
		break;
	case 23: // void doTastaturEreignis( TastaturEreignis )
		if( 1 )
		{
			if( parameter->getEintragAnzahl() < 1 )
				error( 20, {}, obj );
			TastaturEreignis te = parameter->z( 0 ) ? parameter->z( 0 )->getTastaturEreignis() : TastaturEreignis{ 0, 0, 0 };
			val->doTastaturEreignis( te );
		}
		break;
	case 24: // void render( int, int, Bild )
		if( 1 )
		{
			if( parameter->getEintragAnzahl() < 1 )
				error( 20, {}, obj );
			Bild *b = parameter->z( 0 ) ? parameter->z( 0 )->getBild() : 0;
			if( b )
			{
				val->render( *b );
				b->release();
			}
		}
		break;
	case 25: // Text getText()
		if( 1 )
		{
			Text *txt = val->getText();
			ret = new KSGSTextKlasse( obj, *txt );
			txt->release();
		}
		break;
	case 26: // Bild getHintergrundBild()
		if( val->zHintergrundBild() )
			ret = new KSGSBildKlasse( obj, val->getHintergrundBild() );
		break;
	case 27: // int getHintergrundFarbe()
		ret = new KSGSIntKlasse( obj, val->getHintergrundFarbe() );
		break;
	case 28: // int getSchriftGr��e()
		ret = new KSGSIntKlasse( obj, val->getSchriftSize() );
		break;
	case 29: // int getSchriftFarbe()
		ret = new KSGSIntKlasse( obj, val->getSchriftFarbe() );
		break;
	case 30: // int getAFSt�rke()
		ret = new KSGSIntKlasse( obj, val->getAlphaFeldStrength() );
		break;
	case 31: // int getAFFarbe()
		ret = new KSGSIntKlasse( obj, val->getAlphaFeldFarbe() );
		break;
	case 32: // int getLRBreite()
		ret = new KSGSIntKlasse( obj, val->getLinienRahmenBreite() );
		break;
	case 33: // int getLRFarbe()
		ret = new KSGSIntKlasse( obj, val->getLinienRahmenFarbe() );
		break;
	case 34: // int getShowChar()
		ret = new KSGSIntKlasse( obj, val->getShowChar() );
		break;
	case 35: // bool hatStyle( int )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		ret = new KSGSBoolKlasse( obj, val->hatStyle( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0 ) );
		break;
	case 36: // bool hatStyleNicht( int )
		if( parameter->getEintragAnzahl() < 1 )
			error( 20, {}, obj );
		ret = new KSGSBoolKlasse( obj, val->hatStyleNicht( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0 ) );
		break;
	case 37: // TextFeld dublizieren()
		ret = new KSGSTextFeldKlasse( obj, (TextFeld*)val->dublizieren() );
		break;
	case 38: // void setToolTipText( Text )
		if( 1 )
		{
			if( parameter->getEintragAnzahl() < 1 )
				error( 20, {}, obj );
			Text *txt = parameter->z( 0 ) ? parameter->z( 0 )->getText() : 0;
			val->setToolTipText( txt ? *txt : 0, obj->zBildschirm() );
			if( txt )
				txt->release();
		}
		break;
	case 39: // void setPosition( int, int )
		if( parameter->getEintragAnzahl() < 2 )
			error( 20, {}, obj );
		val->setPosition( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0,
						  parameter->z( 1 ) ? parameter->z( 1 )->getInt() : 0 );
		break;
	case 40: // void setGr��e( int, int )
		if( parameter->getEintragAnzahl() < 2 )
			error( 20, {}, obj );
		val->setSize( parameter->z( 0 ) ? parameter->z( 0 )->getInt() : 0,
					   parameter->z( 1 ) ? parameter->z( 1 )->getInt() : 0 );
		break;
	case 41: // int getBreite()
		ret = new KSGSIntKlasse( obj, val->getBreite() );
		break;
	case 42: // int getH�he()
		ret = new KSGSIntKlasse( obj, val->getHeight() );
		break;
	case 43: // int getX()
		ret = new KSGSIntKlasse( obj, val->getX() );
		break;
	case 44: // int getY()
		ret = new KSGSIntKlasse( obj, val->getY() );
		break;
	case 45: // Text getToolTipText()
		if( 1 )
		{
			Text *txt = val->zToolTip() ? val->zToolTip()->zText() : 0;
			ret = new KSGSTextKlasse( obj, txt ? *txt : "" );
		}
		break;
	case 46: // void setGr��eNachText()
		if( 1 )
		{
			Schrift *s = val->zSchrift();
			if( s )
			{
				s->lock();
				s->setSchriftSize( val->getSchriftSize() );
				val->setSize( s->getTextBreite( val->zText() ), s->getTextHeight( val->zText() ) );
				s->unlock();
			}
		}
        break;
    case 47: // void setTextNachGr��e()
        if( 1 )
        {
            Schrift *s = val->zSchrift();
            if( s )
            {
                val->lockZeichnung();
                s->textFormatieren( val->zText(), val->getBreite(), val->getSchriftSize() );
                val->unlockZeichnung();
            }
        }
        break;
	default: // unbekannt
		error( 19, {}, obj );
		break;
	}
	parameter->release();
	return ret;
}

KSGSVariable *KSGSTextFeldKlasse::doOperator( int id, KSGSVariable *rechts )
{
	if( !rechts )
	{
		error( 3, {}, obj );
		return 0;
	}
	KSGSVariable *ret = 0;
	switch( id )
	{
	case KSGS_O_SET:
		if( 1 )
		{
			val->release();
			val = rechts->getTextFeld();
			ret = getThis();
		}
		break;
	}
	if( !ret )
		error( 21, {}, obj );
	if( rechts )
		rechts->release();
	return ret;
}

bool KSGSTextFeldKlasse::doMausEreignis( MausEreignis &me )
{
	if( mausF < 0 )
		return 1;
	RCArray< KSGSVariable > *parameter = new RCArray< KSGSVariable >();
	parameter->add( new KSGSMausEreignisKlasse( obj, me ) );
	KSGSVariable *ret = obj->startFunktion( mausF, parameter );
	if( ret )
	{
		bool r = ret->getBool();
		ret->release();
		return r;
	}
	return 1;
}

bool KSGSTextFeldKlasse::doTastaturEreignis( TastaturEreignis &te )
{
	if( tastaturF < 0 )
		return 1;
	RCArray< KSGSVariable > *parameter = new RCArray< KSGSVariable >();
	parameter->add( new KSGSTastaturEreignisKlasse( obj, te ) );
	KSGSVariable *ret = obj->startFunktion( tastaturF, parameter );
	if( ret )
	{
		bool r = ret->getBool();
		ret->release();
		return r;
	}
	return 1;
}

// constant
TextFeld *KSGSTextFeldKlasse::getVal() const
{
	return val->getThis();
}

TextFeld *KSGSTextFeldKlasse::zVal() const
{
	return val;
}

// Reference Counting
KSGSVariable *KSGSTextFeldKlasse::release()
{
	ref--;
	if( !ref )
		delete this;
	return 0;
}


// Ereignisse
bool KSGScript::ksgsTextFeldME( void *var, void *obj, MausEreignis me )
{
	if( !var )
		return 1;
	return ( (KSGSTextFeldKlasse*)var )->doMausEreignis( me );
}

bool KSGScript::ksgsTextFeldTE( void *var, void *obj, TastaturEreignis te )
{
	if( !var )
		return 1;
	return ( (KSGSTextFeldKlasse*)var )->doTastaturEreignis( te );
}