123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502 |
- #include "KSGSKlasse.h"
- #include "../Error/Error.h"
- #include "../Main/KSGScriptObj.h"
- #include "../Klassen/KSGSTyp.h"
- #include "../Klassen/KSGSBool.h"
- #include "../Klassen/KSGSInt.h"
- #include "../Klassen/KSGSDouble.h"
- #include "../Klassen/KSGSText.h"
- #include "../Klassen/KSGSBild.h"
- #include "../Klassen/KSGSMausEreignis.h"
- #include "../Klassen/KSGSTastaturEreignis.h"
- #include "../Klassen/KSGSTextFeld.h"
- #include "../Klassen/KSGSKnopf.h"
- #include "../Klassen/KSGSFenster.h"
- #include "../Klassen/KSGSBildZ.h"
- #include "../Klassen/KSGSAnimation2DData.h"
- #include "../Klassen/KSGSAnimation2D.h"
- #include "../Klassen/KSGSArray.h"
- using namespace KSGScript;
- // Inhalt der KSGSKlasseInstanz Klasse aus KSGSKlasse.h
- // Konstruktor
- KSGSKlasseInstanz::KSGSKlasseInstanz( int typ, Array< KSGSVariableDef* > *zVars, RCArray< KSGSFunktion > *funcs, KSGScriptObj *zObj )
- {
- lokaleVariablen = new RCArray< KSGSVariable >();
- varPublic = new Array< bool >();
- funktionen = funcs;
- obj = zObj->getThis();
- lokaleVariablen->add( getThis(), 0 );
- varPublic->set( 0, 0 );
- int anz = zVars ? zVars->getEintragAnzahl() : 0;
- for( int i = 0; i < anz; i++ )
- {
- lokaleVariablen->set( KSGSKlasseInstanz::erstellVariable( zObj, zVars->get( i ) ), zVars->get( i )->id + 1 );
- varPublic->set( zVars->get( i )->sichtbar == 1, zVars->get( i )->id + 1 );
- }
- this->typ = typ;
- ref = 1;
- }
- // Destruktor
- KSGSKlasseInstanz::~KSGSKlasseInstanz()
- {
- lokaleVariablen->release();
- if( funktionen )
- funktionen->release();
- varPublic->release();
- obj->release();
- }
- // nicht constant
- KSGSVariable *KSGSKlasseInstanz::startFunktion( int id, bool zugriff, RCArray< KSGSVariable > *parameter )
- {
- if( !funktionen || ( !zugriff && ( !funktionen->z( id ) || funktionen->z( id )->getSichtbarkeit() != 1 ) ) )
- {
- error( 18, {}, obj );
- parameter->release();
- return 0;
- }
- if( !funktionen->z( id ) )
- {
- parameter->release();
- return 0;
- }
- KSGSFunktionInstanz *inst = funktionen->z( id )->erstellInstanz( (KSGScriptO*)obj->getThis(), (KSGSKlasseInstanz*)getThis(), parameter );
- KSGSVariable *ret = inst->startFunktion();
- inst->release();
- return ret;
- }
- KSGSVariable *KSGSKlasseInstanz::doOperator( int id, KSGSVariable *rechts )
- {
- error( 21, {}, obj );
- if( rechts )
- rechts->release();
- return 0;
- }
- void KSGSKlasseInstanz::setVariable( int id, KSGSVariable *var )
- {
- lokaleVariablen->set( var, id );
- }
- // constant
- KSGSVariable *KSGSKlasseInstanz::getVariable( int id, bool zugriff ) const
- {
- if( !zugriff && ( !varPublic->hat( id ) || !varPublic->get( id ) ) )
- {
- error( 17, {}, obj );
- return 0;
- }
- return lokaleVariablen->get( id );
- }
- KSGSVariable *KSGSKlasseInstanz::umwandelnIn( int typ ) const
- {
- error( 16, {}, obj );
- return 0;
- }
- int KSGSKlasseInstanz::getTyp() const
- {
- return typ;
- }
- // verarbeiten
- bool KSGSKlasseInstanz::getBool() const
- {
- if( typ == KSGS_BOOL )
- return ( ( KSGSBoolKlasse* )this )->getVal();
- else
- {
- KSGSBoolKlasse *tmp = (KSGSBoolKlasse*)umwandelnIn( KSGS_BOOL );
- if( tmp )
- {
- bool ret = tmp->getVal();
- tmp->release();
- return ret;
- }
- return 0;
- }
- }
- int KSGSKlasseInstanz::getInt() const
- {
- if( typ == KSGS_INT )
- return ( ( KSGSIntKlasse* )this )->getVal();
- else
- {
- KSGSIntKlasse *tmp = (KSGSIntKlasse*)umwandelnIn( KSGS_INT );
- if( tmp )
- {
- int ret = tmp->getVal();
- tmp->release();
- return ret;
- }
- return 0;
- }
- }
- double KSGSKlasseInstanz::getDouble() const
- {
- if( typ == KSGS_DOUBLE )
- return ( ( KSGSDoubleKlasse* )this )->getVal();
- else
- {
- KSGSDoubleKlasse *tmp = (KSGSDoubleKlasse*)umwandelnIn( KSGS_DOUBLE );
- if( tmp )
- {
- double ret = tmp->getVal();
- tmp->release();
- return ret;
- }
- return 0;
- }
- }
- Text *KSGSKlasseInstanz::getText() const
- {
- if( typ == KSGS_TEXT )
- return ( ( KSGSTextKlasse* )this )->getVal();
- else
- {
- KSGSTextKlasse *tmp = (KSGSTextKlasse*)umwandelnIn( KSGS_TEXT );
- if( tmp )
- {
- Text *ret = tmp->getVal();
- tmp->release();
- return ret;
- }
- return new Text( "" );
- }
- }
- Bild *KSGSKlasseInstanz::getBild() const
- {
- if( typ == KSGS_BILD )
- return ( ( KSGSBildKlasse* )this )->getVal();
- else
- {
- KSGSBildKlasse *tmp = (KSGSBildKlasse*)umwandelnIn( KSGS_BILD );
- if( tmp )
- {
- Bild *ret = tmp->getVal();
- tmp->release();
- return ret;
- }
- return new Bild();
- }
- }
- MausEreignis KSGSKlasseInstanz::getMausEreignis() const
- {
- if( typ == KSGS_MAUSEREIGNIS )
- return ( ( KSGSMausEreignisKlasse* )this )->getVal();
- else
- {
- KSGSMausEreignisKlasse *tmp = (KSGSMausEreignisKlasse*)umwandelnIn( KSGS_MAUSEREIGNIS );
- if( tmp )
- {
- MausEreignis ret = tmp->getVal();
- tmp->release();
- return ret;
- }
- return MausEreignis{ 0, 0, 0, 0, 0, 0 };
- }
- }
- TastaturEreignis KSGSKlasseInstanz::getTastaturEreignis() const
- {
- if( typ == KSGS_TASTATUREREIGNIS )
- return ( ( KSGSTastaturEreignisKlasse* )this )->getVal();
- else
- {
- KSGSTastaturEreignisKlasse *tmp = (KSGSTastaturEreignisKlasse*)umwandelnIn( KSGS_TASTATUREREIGNIS );
- if( tmp )
- {
- TastaturEreignis ret = tmp->getVal();
- tmp->release();
- return ret;
- }
- return TastaturEreignis{ 0, 0, 0 };
- }
- }
- TextFeld *KSGSKlasseInstanz::getTextFeld() const
- {
- if( typ == KSGS_TEXTFELD )
- return ( ( KSGSTextFeldKlasse* )this )->getVal();
- else
- {
- KSGSTextFeldKlasse *tmp = (KSGSTextFeldKlasse*)umwandelnIn( KSGS_TEXTFELD );
- if( tmp )
- {
- TextFeld *ret = tmp->getVal();
- tmp->release();
- return ret;
- }
- return new TextFeld();
- }
- }
- Knopf *KSGSKlasseInstanz::getKnopf() const
- {
- if( typ == KSGS_KNOPF )
- return ( ( KSGSKnopfKlasse* )this )->getVal();
- else
- {
- KSGSKnopfKlasse *tmp = (KSGSKnopfKlasse*)umwandelnIn( KSGS_KNOPF );
- if( tmp )
- {
- Knopf *ret = tmp->getVal();
- tmp->release();
- return ret;
- }
- return new Knopf();
- }
- }
- Fenster *KSGSKlasseInstanz::getFenster() const
- {
- if( typ == KSGS_FENSTER )
- return ( ( KSGSFensterKlasse* )this )->getVal();
- else
- {
- KSGSFensterKlasse *tmp = (KSGSFensterKlasse*)umwandelnIn( KSGS_FENSTER );
- if( tmp )
- {
- Fenster *ret = tmp->getVal();
- tmp->release();
- return ret;
- }
- return new Fenster();
- }
- }
- BildZ *KSGSKlasseInstanz::getBildZ() const
- {
- if( typ == KSGS_BILDO )
- return ( ( KSGSBildZKlasse* )this )->getVal();
- else
- {
- KSGSBildZKlasse *tmp = (KSGSBildZKlasse*)umwandelnIn( KSGS_BILDO );
- if( tmp )
- {
- BildZ *ret = tmp->getVal();
- tmp->release();
- return ret;
- }
- return new BildZ();
- }
- }
- Animation2DData *KSGSKlasseInstanz::getAnimation2DData() const
- {
- if( typ == KSGS_ANIMATION2DDATA )
- return ( ( KSGSAnimation2DDataKlasse* )this )->getVal();
- else
- {
- KSGSAnimation2DDataKlasse *tmp = (KSGSAnimation2DDataKlasse*)umwandelnIn( KSGS_ANIMATION2DDATA );
- if( tmp )
- {
- Animation2DData *ret = tmp->getVal();
- tmp->release();
- return ret;
- }
- return new Animation2DData();
- }
- }
- Animation2D *KSGSKlasseInstanz::getAnimation2D() const
- {
- if( typ == KSGS_ANIMATION2D )
- return ( ( KSGSAnimation2DKlasse* )this )->getVal();
- else
- {
- KSGSAnimation2DKlasse *tmp = (KSGSAnimation2DKlasse*)umwandelnIn( KSGS_ANIMATION2D );
- if( tmp )
- {
- Animation2D *ret = tmp->getVal();
- tmp->release();
- return ret;
- }
- return new Animation2D();
- }
- }
- Zeichnung *KSGSKlasseInstanz::getZeichnung() const
- {
- switch( typ )
- {
- case KSGS_TEXTFELD:
- return ((KSGSTextFeldKlasse*)this)->zVal();
- case KSGS_KNOPF:
- return ( ( KSGSKnopfKlasse* )this )->zVal();
- case KSGS_FENSTER:
- return ( ( KSGSFensterKlasse* )this )->zVal();
- case KSGS_BILDO:
- return ( ( KSGSBildZKlasse* )this )->zVal();
- case KSGS_ANIMATION2D:
- return ( ( KSGSAnimation2DKlasse* )this )->zVal();
- }
- return 0;
- }
- RCArray< KSGSVariable > *KSGSKlasseInstanz::getArray() const
- {
- if( typ == KSGS_ARRAY )
- return ( ( KSGSArrayKlasse* )this )->getVal();
- else
- {
- KSGSArrayKlasse *tmp = (KSGSArrayKlasse*)umwandelnIn( KSGS_ARRAY );
- if( tmp )
- {
- RCArray< KSGSVariable > *ret = tmp->getVal();
- tmp->release();
- return ret;
- }
- return new RCArray< KSGSVariable >();
- }
- }
- // Reference Counting
- KSGSVariable *KSGSKlasseInstanz::getThis()
- {
- ref++;
- return this;
- }
- KSGSVariable *KSGSKlasseInstanz::release()
- {
- ref--;
- if( !ref )
- delete this;
- return 0;
- }
- // static
- KSGSVariable *KSGSKlasseInstanz::erstellVariable( KSGScriptObj *zObj, KSGSVariableDef *def )
- {
- if( !def )
- {
- error( 0, {}, zObj );
- return 0;
- }
- if( def->typId < KSGS_TYP_MIN )
- {
- error( 0, {}, zObj );
- return 0;
- }
- if( def->typId <= KSGS_TYP_MAX )
- { // Vordefinierter Typ
- switch( def->typId )
- {
- case KSGS_BOOL:
- if( def->wert.istGleich( "true" ) )
- return new KSGSBoolKlasse( zObj, 1 );
- if( def->wert.istGleich( "false" ) )
- return new KSGSBoolKlasse( zObj, 0 );
- if( def->wert.getLength() )
- return new KSGSBoolKlasse( zObj, ( int )def->wert != 0 );
- return new KSGSBoolKlasse( zObj );
- case KSGS_INT:
- if( def->wert.getLength() )
- return new KSGSIntKlasse( zObj, def->wert );
- return new KSGSIntKlasse( zObj );
- case KSGS_DOUBLE:
- if( def->wert.getLength() )
- return new KSGSDoubleKlasse( zObj, def->wert );
- return new KSGSDoubleKlasse( zObj );
- case KSGS_TEXT:
- if( def->wert.getLength() )
- return new KSGSTextKlasse( zObj, def->wert );
- return new KSGSTextKlasse( zObj );
- case KSGS_BILD:
- return new KSGSBildKlasse( zObj );
- case KSGS_MAUSEREIGNIS:
- return new KSGSMausEreignisKlasse( zObj );
- case KSGS_TASTATUREREIGNIS:
- return new KSGSTastaturEreignisKlasse( zObj );
- case KSGS_TEXTFELD:
- return new KSGSTextFeldKlasse( zObj );
- case KSGS_KNOPF:
- return new KSGSKnopfKlasse( zObj );
- case KSGS_FENSTER:
- return new KSGSFensterKlasse( zObj );
- case KSGS_BILDO:
- return new KSGSBildZKlasse( zObj );
- case KSGS_ANIMATION2DDATA:
- return new KSGSAnimation2DDataKlasse( zObj );
- case KSGS_ANIMATION2D:
- return new KSGSAnimation2DKlasse( zObj );
- default:
- error( 1, {}, zObj );
- break;
- }
- return 0;
- }
- else if( zObj ) // Im Script Definierter Typ
- return zObj->erstellKlassenInstanz( def->typId );
- error( 0, {}, zObj );
- return 0;
- }
- // Inhalt der KSGSKlasse Klasse aus KSGSKlasse.h
- // Konstruktor
- KSGSKlasse::KSGSKlasse( int id )
- {
- var = new Array< KSGSVariableDef* >();
- funktionen = new RCArray< KSGSFunktion >();
- this->id = id;
- ref = 1;
- }
- // Destruktor
- KSGSKlasse::~KSGSKlasse()
- {
- int anz = var->getEintragAnzahl();
- for( int i = 0; i < anz; i++ )
- delete var->get( i );
- var->release();
- funktionen->release();
- }
- // nicht constant
- void KSGSKlasse::addVariable( KSGSVariableDef *var )
- {
- this->var->add( var );
- }
- void KSGSKlasse::addFunktion( KSGSFunktion *func )
- {
- funktionen->add( func );
- }
- KSGSKlasseInstanz *KSGSKlasse::erstellInstanz( KSGScriptObj *zObj )
- {
- return new KSGSKlasseInstanz( id, var, funktionen->getThis(), zObj );
- }
- // constant
- int KSGSKlasse::getId() const
- {
- return id;
- }
- // Reference Counting
- KSGSKlasse *KSGSKlasse::getThis()
- {
- ref++;
- return this;
- }
- KSGSKlasse *KSGSKlasse::release()
- {
- ref--;
- if( !ref )
- delete this;
- return 0;
- }
|