diff options
author | No'am Rosenthal <noam.rosenthal@nokia.com> | 2009-08-09 23:16:53 -0700 |
---|---|---|
committer | No'am Rosenthal <noam.rosenthal@nokia.com> | 2009-08-09 23:16:53 -0700 |
commit | f1f797379920403bd68847988f78cab72c0fd111 (patch) | |
tree | 3e2339b22d7bb359b0fb8dae949659ac5f4cf4b3 /scc/scc.xslt | |
parent | 82c237bd9ed36c2140ccfbde994a80b321594d97 (diff) |
Statechart Compiler with examples
Diffstat (limited to 'scc/scc.xslt')
-rw-r--r-- | scc/scc.xslt | 330 |
1 files changed, 219 insertions, 111 deletions
diff --git a/scc/scc.xslt b/scc/scc.xslt index de42521..e023e96 100644 --- a/scc/scc.xslt +++ b/scc/scc.xslt @@ -1,73 +1,112 @@ <?xml version="1.0" encoding="ISO-8859-1"?> -<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> -<xsl:template name="smname"><xsl:choose><xsl:when test="string(/scxml/@name)=''"><xsl:value-of select="$target" /></xsl:when> - <xsl:otherwise><xsl:value-of select="/scxml/@name" /></xsl:otherwise></xsl:choose> +<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s="http://www.w3.org/2005/07/scxml" + xmlns:Qt="http://www.qtsoftware.com scxml-ext"> +<xsl:template name="smname"><xsl:choose><xsl:when test="string(/s:scxml/@name)=''"><xsl:value-of select="$target" /></xsl:when> + <xsl:otherwise><xsl:value-of select="/sLscxml/@name" /></xsl:otherwise></xsl:choose> </xsl:template> -<xsl:template mode="stateid" match="*"> - <xsl:choose > +<xsl:template name="comment"><xsl:if test="$comments"> + /* + <xsl:element name="{name()}"> + <xsl:for-each select="@*"><xsl:attribute name="{name()}"> + <xsl:value-of select="string()" /></xsl:attribute></xsl:for-each><xsl:value-of select="text()" /></xsl:element> + */ +</xsl:if></xsl:template> +<xsl:template mode="stateid" match="s:scxml|s:state|s:parallel|s:final|s:initial|s:history" priority="2"> + <xsl:choose> <xsl:when test="name()='scxml'">this</xsl:when> <xsl:when test="string(@id) != ''" >state_<xsl:value-of select="@id" /></xsl:when> <xsl:otherwise>state_<xsl:value-of select="generate-id()" /></xsl:otherwise> </xsl:choose> </xsl:template> -<xsl:template mode="execContext" match="if"> - if (<xsl:value-of select="@cond" />) { +<xsl:template mode="execContext" match="s:if"> +<xsl:call-template name="comment" /> + if (<xsl:value-of select="@cond" />) { <xsl:apply-templates mode="execContext" /> - } + } </xsl:template> -<xsl:template mode="execContext" match="else"> - } else { +<xsl:template mode="execContext" match="s:else"> +<xsl:call-template name="comment" /> + } else { </xsl:template> -<xsl:template mode="execContext" match="elseif"> - } else if (<xsl:value-of select="@cond" />) { +<xsl:template mode="execContext" match="s:elseif"> +<xsl:call-template name="comment" /> + } else if (<xsl:value-of select="@cond" />) { </xsl:template> -<xsl:template mode="execContext" match="log"> - QDebug((QtMsgType)<xsl:if test="string(@level)=''">0</xsl:if><xsl:value-of select="@level" />) << "<xsl:value-of select="@label" />" << <xsl:value-of select="@expr" />; +<xsl:template mode="execContext" match="s:log"> +<xsl:call-template name="comment" /> + QDebug((QtMsgType)<xsl:if test="string(@level)=''">0</xsl:if><xsl:value-of select="@level" />) <xsl:if test="string(@label)!=''"><< "<xsl:value-of select="@label" />" </xsl:if><< <xsl:value-of select="@expr" />; </xsl:template> -<xsl:template mode="execContext" match="assign"> - <xsl:if test="string(@dataid) != ''"> - set_<xsl:value-of select="@dataid" />(<xsl:value-of select="@expr" />); - </xsl:if> +<xsl:template mode="execContext" match="s:assign"><xsl:call-template name="comment" /> +<xsl:choose> + + <xsl:when test="string(@dataid) != ''"> + set_<xsl:value-of select="@dataid" />(<xsl:value-of select="@expr" />); + </xsl:when> + <xsl:when test="string(@location) != ''"> + <xsl:value-of select="@location" /> = (<xsl:value-of select="@expr" />); + </xsl:when> +</xsl:choose> </xsl:template> -<xsl:template mode="execContext" match="raise|send"> +<xsl:template mode="execContext" match="s:raise|s:send"> +<xsl:call-template name="comment" /> <xsl:choose> <xsl:when test="name()='raise' or target='_internal'">postInternalEvent(</xsl:when> <xsl:otherwise><xsl:if test="string(@id)!=''"> - eventSenders[<xsl:value-of select="@id" />] = </xsl:if>new SCC_EventSender(this,<xsl:if test="string(@delay)=''">0</xsl:if> + _eventSenders["<xsl:value-of select="@id" />"] = </xsl:if>new SCC_EventSender(this,<xsl:if test="string(@delay)=''">0</xsl:if> <xsl:value-of select="@delay" />, </xsl:otherwise> - </xsl:choose>new QSignalEvent(<xsl:if + </xsl:choose> + new QSignalEvent(<xsl:if test="string(@target)=''">this</xsl:if><xsl:value-of - select="@target" />,(*metaObject()).indexOfSignal("<xsl:value-of select="replace(@event,'\.','__')" />"),QVariantList()<xsl:for-each - select="param"><xsl:text><![CDATA[<<]]></xsl:text> QVariant(<xsl:value-of select="@expr" /><xsl:value-of select="text()" />) + select="@target" />,metaObject()->indexOfSignal(QMetaObject::normalizedSignature("event_<xsl:value-of select="replace(@event,'\.','__')" /><xsl:if test="not(contains(@event,')'))">()</xsl:if>")),QVariantList()<xsl:for-each + select="s:param"><xsl:text><![CDATA[<<]]></xsl:text> QVariant(<xsl:choose> + <xsl:when test="string(@expr)!=''"><xsl:value-of select="@expr" /></xsl:when> + <xsl:when test="string(@name)!=''">get_<xsl:value-of select="@name" />()</xsl:when> + <xsl:otherwise><xsl:value-of select="text()" /></xsl:otherwise> + </xsl:choose>) </xsl:for-each>)); </xsl:template> -<xsl:template mode="execContext" match="cancel"> - { QObject* obj = eventSenders[<xsl:value-of select="@id" />]; if (obj) { (*obj).cancel(); } +<xsl:template mode="execContext" match="s:cancel"> +<xsl:call-template name="comment" /><![CDATA[ + { + QPointer<SCC_EventSender> es = _eventSenders["]]><xsl:value-of select="@id" />"]; + if (es) + es->cancel(); + } </xsl:template> <xsl:template match="/"> +#ifndef __SMCLASS_<xsl:call-template name="smname" />_H +#define __SMCLASS_<xsl:call-template name="smname" />_H #include "QStateMachine" #include "QSignalTransition" -<xsl:if test="count(//send[@target!='_internal']) != 0"> #include "QTimer" -</xsl:if> -<xsl:if test="count(//final)!=0"> +#include "QMetaMethod" +#include "QPointer" +#include "QVariant" +<xsl:if test="count(//s:final)!=0"> + #include "QFinalState" </xsl:if> -<xsl:if test="count(//history)!=0"> +<xsl:if test="count(//s:history)!=0"> #include "QHistoryState" </xsl:if> #include "QHash" #include "QSignalEvent" #include "QEventTransition" -<xsl:if test="count(//log)!=0"> +<xsl:if test="count(//s:log)!=0"> #include "QDebug" </xsl:if> -#ifndef __SMCLASS_<xsl:call-template name="smname" />_H -#define __SMCLASS_<xsl:call-template name="smname" />_H +<xsl:if test="count(//s:transition[string(@Qt:animation)!=''])!=0"> +#include "QPropertyAnimation" +</xsl:if> + +#define In(state) (configuration().contains(state_##state)) + +<xsl:value-of select="/s:scxml/Qt:cpp/text()" /> + class SMClass_<xsl:call-template name="smname" />; - <xsl:if test="count(//transition[string(@event)='' and string(@cond)=''])!=0"> + <xsl:if test="count(//s:transition[string(@event)='' and string(@cond)=''])!=0"> class SCC_UnconditionalTransition : public QAbstractTransition { public: @@ -78,34 +117,51 @@ class SMClass_<xsl:call-template name="smname" />; bool eventTest(QEvent *) { return true; } }; </xsl:if> - <xsl:if test="count(//send[string(@target)!='_internal'])!=0"> + <xsl:if test="count(//s:send[string(@target)!='_internal'])!=0"> + <![CDATA[ + #define ARG_FROM_VAR(I) \ + (acount > I \ + ? QGenericArgument(((QSignalEvent*)event)->arguments()[I].typeName(),((QSignalEvent*)event)->arguments()[I].data()) \ + : QGenericArgument()) + + class SCC_EventSender : public QTimer { Q_OBJECT private: QStateMachine* machine; - QEvent* event; + QSignalEvent* event; public: - SCC_EventSender(QStateMachine* m, int delay, QEvent* e) : QTimer(m), machine(m), event(e) + SCC_EventSender(QStateMachine* m=NULL, int delay=0, QSignalEvent* e=NULL) : QTimer(m), machine(m), event(e) { setInterval(delay); setSingleShot(true); connect(this,SIGNAL(timeout()),this,SLOT(send())); + start(); } public Q_SLOTS: void cancel() { stop(); deleteLater(); } - void send() { machine->postEvent(event); } + void send() { + QVariantList args = event->arguments(); + int acount = args.count(); + event->sender()->metaObject()->method(event->signalIndex()).invoke(event->sender(), + ARG_FROM_VAR(0),ARG_FROM_VAR(1),ARG_FROM_VAR(2),ARG_FROM_VAR(3),ARG_FROM_VAR(4), + ARG_FROM_VAR(5),ARG_FROM_VAR(6),ARG_FROM_VAR(7),ARG_FROM_VAR(8),ARG_FROM_VAR(9)); + deleteLater(); + } }; - </xsl:if> - <xsl:if test="count(//transition[string(@cond) != '']) !=0"> + ]]></xsl:if> + <xsl:if test="count(//s:transition[string(@cond) != '' or @event='*']) !=0"> namespace { - <xsl:for-each select="//transition[string(@cond) != '']"> - class Transition_<xsl:value-of select="generate-id()" /> : public Q<xsl:if test="string(@event) != ''">Signal</xsl:if>Transition + <xsl:for-each select="//s:transition[string(@cond) != '' or @event='*']"> + <xsl:call-template name="comment" /> + class Transition_<xsl:value-of select="generate-id()" /> : public QSignalTransition { SMClass_<xsl:call-template name="smname" />* stateMachine; public: Transition_<xsl:value-of select="generate-id()" />(QState* parent) - : Q<xsl:if test="string(@event) != ''">Signal</xsl:if>Transition(parent),stateMachine((SMClass_<xsl:call-template name="smname" />*)(*parent).machine()) + : QSignalTransition(parent->machine(),<xsl:choose><xsl:when test="@event='*'">SIGNAL(destroyed())</xsl:when><xsl:otherwise>SIGNAL(event_<xsl:value-of select="@event" />)</xsl:otherwise></xsl:choose>,parent) + ,stateMachine((SMClass_<xsl:call-template name="smname" />*)parent->machine()) { } @@ -119,145 +175,197 @@ namespace { class SMClass_<xsl:call-template name="smname" /> : public QStateMachine { Q_OBJECT -<xsl:for-each select="//datamodel/data"> - Q_PROPERTY(<xsl:value-of select="concat(@type,' ')" /> <xsl:value-of select="@id" /> READ get_<xsl:value-of select="@id" /> WRITE set_<xsl:value-of select="@id" /> NOTIFY <xsl:value-of select="@id" />_changed) +<xsl:for-each select="//s:datamodel/s:data"> + <xsl:call-template name="comment" /> + Q_PROPERTY(<xsl:value-of select="concat(@Qt:type,' ')" /> <xsl:value-of select="@id" /> READ get_<xsl:value-of select="@id" /> WRITE set_<xsl:value-of select="@id" /> NOTIFY <xsl:value-of select="@id" />_changed) </xsl:for-each> -<xsl:for-each select="//transition/@animation"> - Q_PROPERTY(QAbstractAnimation* <xsl:value-of select="string()" /> READ anim_<xsl:value-of select="string()" /> WRITE setAnim_<xsl:value-of select="string()" />) +<xsl:for-each select="//s:transition/Qt:animation"> + <xsl:call-template name="comment" /> + Q_PROPERTY(QPropertyAnimation* <xsl:value-of select="string()" /> READ anim_<xsl:value-of select="string()" /> WRITE setAnim_<xsl:value-of select="string()" />) </xsl:for-each> public: - SMClass_<xsl:call-template name="smname" />(QObject* o) : QStateMachine(o) {} - <xsl:for-each select="//state|//parallel|//initial[count(transition/*)!=0]"> - QState* <xsl:apply-templates mode="stateid" select="current()" />;</xsl:for-each> - <xsl:for-each select="//final"> - QFinalState* <xsl:apply-templates mode="stateid" select="current()" />; + SMClass_<xsl:call-template name="smname" />(QObject* o = NULL) + : QStateMachine(o) + { +<xsl:for-each select="//s:datamodel/s:data[string-length(concat(string(text()),string(@expr)))!=0]"> + <xsl:call-template name="comment" /> + <xsl:if test="string(@expr) != ''"> + _data.<xsl:value-of select="@id" /> = <xsl:value-of select="@expr"/><xsl:value-of select="text()"/>; + </xsl:if> +</xsl:for-each> + } + <xsl:for-each select="//s:state|//s:parallel|//s:initial"> + <xsl:call-template name="comment" /> + QState* <xsl:apply-templates mode="stateid" select="." />;</xsl:for-each> + <xsl:for-each select="//s:final"> + <xsl:call-template name="comment" /> + QFinalState* <xsl:apply-templates mode="stateid" select="." />; </xsl:for-each> - <xsl:for-each select="//history"> - QHistoryState* <xsl:apply-templates mode="stateid" select="current()" />; + <xsl:for-each select="//s:history"> + <xsl:call-template name="comment" /> + QHistoryState* <xsl:apply-templates mode="stateid" select="." />; </xsl:for-each> - <xsl:for-each select="//transition[string(@cond) != '']"> - bool testCondition_<xsl:value-of select="generate-id()" />(const QEvent & _event) + <xsl:for-each select="//s:transition[string(@cond) != '']"> + <xsl:call-template name="comment" /> + inline bool testCondition_<xsl:value-of select="generate-id()" />() { - Q_UNUSED(_event) return <xsl:if test="string(@cond)=''">true</xsl:if><xsl:value-of select="@cond"/>; } </xsl:for-each> - <xsl:for-each select="//datamodel/data"> - <xsl:value-of select="@type" /> get_<xsl:value-of select="@id" />() const + <xsl:for-each select="//s:datamodel/s:data"> + <xsl:call-template name="comment" /> + <xsl:text> </xsl:text><xsl:value-of select="@Qt:type" /> get_<xsl:value-of select="@id" />() const { return _data.<xsl:value-of select="@id" />; } - void set_<xsl:value-of select="@id" />(const <xsl:value-of select="@type" /> & value) - { - _data.<xsl:value-of select="@id" /> = value; - emit <xsl:value-of select="@id" />_changed(value); - } </xsl:for-each> - <xsl:if test="count(//datamodel/data) != 0"> + <xsl:if test="count(//s:datamodel/s:data) != 0"><![CDATA[ protected: struct { - <xsl:for-each select="//datamodel/data"> - <xsl:text> </xsl:text><xsl:value-of select="@type" /><xsl:text> </xsl:text><xsl:value-of select="@id" />;</xsl:for-each> + ]]><xsl:for-each select="//s:datamodel/s:data"> + <xsl:call-template name="comment" /> + <xsl:text> </xsl:text><xsl:value-of select="@Qt:type" /><xsl:text> </xsl:text><xsl:value-of select="@id" />; + </xsl:for-each> } _data; </xsl:if> - <xsl:if test="(count(//datamodel/data)+count(/scxml/script))!=0"> - void initScript() + struct { + QString name; + QVariantList data; + } _event; + QString _name; + <xsl:if test="(count(//s:datamodel/s:data)+count(/s:scxml/s:script))!=0"> + public Q_SLOTS: +</xsl:if> +<xsl:for-each select="//s:datamodel/s:data"> + <xsl:call-template name="comment" /> + void set_<xsl:value-of select="@id" />(<xsl:value-of select="@Qt:type" /> const & value) { -<xsl:for-each select="//datamodel/data"> - <xsl:if test="string(@expr) != ''"> - _data.<xsl:value-of select="@id" /> = <xsl:value-of select="@expr"/><xsl:value-of select="text()"/>; - </xsl:if> -</xsl:for-each> - <xsl:value-of select="/scxml/script/text()" /> + _data.<xsl:value-of select="@id" /> = value; + emit <xsl:value-of select="@id" />_changed(value); } -</xsl:if> + </xsl:for-each> private Q_SLOTS: - <xsl:for-each select="//transition|//onentry|//onexit"><xsl:if test="count(*) != 0"> +#ifndef QT_NO_PROPERTIES + void assignProperties() + { + <xsl:for-each select="//Qt:property"> + <xsl:call-template name="comment" /> +<xsl:text> </xsl:text><xsl:apply-templates mode="stateid" select=".." />->assignProperty(<xsl:value-of + select="@object" />,"<xsl:value-of select="@property" />",QVariant(<xsl:value-of select="@value" />)); + </xsl:for-each> +#endif + } + <xsl:for-each select="//s:transition|//s:onentry|//s:onexit"><xsl:if test="count(*) != 0"> + <xsl:for-each select="..|."><xsl:call-template name="comment" /></xsl:for-each> void exec_<xsl:value-of select="generate-id()" />() { <xsl:apply-templates mode="execContext" /> } </xsl:if></xsl:for-each> - Q_SIGNALS:<xsl:for-each select="distinct-values(//node()[not (starts-with(@event,'done.state.') or contains(@event,':'))]/@event)"> - void event_<xsl:value-of select="replace(string(),'\.','__')" />();</xsl:for-each> - <xsl:for-each select="//datamodel/data"> - void <xsl:value-of select="@id" />_changed(const <xsl:value-of select="@type" /> &); + Q_SIGNALS:<xsl:for-each select="distinct-values(//node()[not (starts-with(@event,'done.state.') or @event='*' or contains(@event,':'))]/@event)"> + void event_<xsl:value-of select="replace(string(),'\.','__')" /><xsl:if test="not(contains(string(),')'))">()</xsl:if>;</xsl:for-each> + <xsl:for-each select="//s:datamodel/s:data"> + <xsl:call-template name="comment" /> + void <xsl:value-of select="@id" />_changed(<xsl:value-of select="@Qt:type" /> const &); </xsl:for-each> - <xsl:if test="count(//property)!=0"> + <xsl:if test="count(//Qt:property)!=0"><![CDATA[ protected: -#ifndef QT_NO_PROPERTIES - virtual void endSelectTransitions(QEvent *event) + virtual void beginSelectTransitions(QEvent *event) { - <xsl:for-each select="//property"> - (*<xsl:apply-templates mode="stateid" select=".." />).assignProperty(<xsl:value-of - select="@object" />,"<xsl:value-of select="@name" />",QVariant(<xsl:value-of select="@expr" />)); - </xsl:for-each> + if (event && !event->type() == QEvent::None) { + switch (event->type()) { + case QEvent::Signal: { + QSignalEvent* e = (QSignalEvent*)event; + _event.data = e->arguments(); + _event.name = e->sender()->metaObject()->method(e->signalIndex()).signature(); + if (e->sender() == this) + _event.name = _event.name.mid(6); + } break; + default: + break; + } + } else { + _event.name = ""; + _event.data.clear(); + } + ]]> + assignProperties(); } -#endif - </xsl:if> -<xsl:if test="count(//send[string(@target)!='internal']) != 0"> +</xsl:if> +<xsl:if test="count(//s:send[string(@target)!='internal']) != 0"> private: - <xsl:text><![CDATA[QHash<QString,SCC_EventSender>]]></xsl:text> _eventSenders; + <xsl:text><![CDATA[QHash<QString,QPointer<SCC_EventSender> >]]></xsl:text> _eventSenders; </xsl:if> + protected: public: void setupStateMachine() { - setObjectName("<xsl:call-template name="smname" />"); - <xsl:for-each select="//state|//parallel|//final|//history|//initial"> - <xsl:apply-templates mode="stateid" select="." /> = new <xsl:choose> + _name = "<xsl:call-template name="smname" />"; + setObjectName(_name); + <xsl:for-each select="//s:state|//s:parallel|//s:final|//s:history|//s:initial"> + <xsl:call-template name="comment" /> + <xsl:text> </xsl:text><xsl:apply-templates mode="stateid" select="." /> = new <xsl:choose> <xsl:when test="name()='final'">QFinalState</xsl:when> <xsl:when test="name()='history'">QHistoryState</xsl:when> <xsl:otherwise>QState</xsl:otherwise> </xsl:choose>(<xsl:apply-templates mode="stateid" select=".." />); - (*<xsl:apply-templates mode="stateid" select="." />).setObjectName("<xsl:value-of select="@id" />"); - <xsl:if + <xsl:if test="string(@id)!=''"><xsl:apply-templates mode="stateid" select="." />->setObjectName("<xsl:value-of select="@id" />");</xsl:if> + <xsl:if test="name()='initial' or @id=../@initial"> - (*<xsl:apply-templates mode="stateid" select=".." />).setInitialState(<xsl:apply-templates mode="stateid" select="." />);</xsl:if> + <xsl:apply-templates mode="stateid" select=".." />->setInitialState(<xsl:apply-templates mode="stateid" select="." />); + </xsl:if> <xsl:if test="name()='parallel'"> - (*<xsl:apply-templates mode="stateid" select="." />).setChildMode(ParallelStates); - </xsl:if> + <xsl:apply-templates mode="stateid" select="." />->setChildMode(ParallelStates); + </xsl:if> <xsl:if test="name()='history'"> - (*<xsl:apply-templates mode="stateid" select="." />).setHistoryType(QHistoryState::<xsl:choose> + <xsl:apply-templates mode="stateid" select="." />->setHistoryType(QHistoryState::<xsl:choose> <xsl:when test="@type='deep'">Deep</xsl:when> <xsl:otherwise>Shallow</xsl:otherwise> </xsl:choose>History); - </xsl:if> + </xsl:if> </xsl:for-each> - QAbstractTransition* transition;<xsl:for-each select="//transition"> + QAbstractTransition* transition;<xsl:for-each select="//s:transition[../name()!='history']"> + <xsl:call-template name="comment" /> transition = new <xsl:choose> - <xsl:when test="string(@cond)!=''">Transition_<xsl:value-of + <xsl:when test="@event='*' or string(@cond)!=''">Transition_<xsl:value-of select="generate-id()" />(</xsl:when> <xsl:when test="starts-with(@event,'q-event:')">QEventTransition(<xsl:value-of select="substring-after(@event,'q-event:')" />,</xsl:when> <xsl:when test="starts-with(@event,'done.state.')">QSignalTransition(state_<xsl:value-of select="substring-after(@event,'done.state.')" />,SIGNAL(finished()),</xsl:when> - <xsl:when test="string(@event)!=''">QSignalTransition(this,SIGNAL(event_<xsl:value-of select="replace(@event,'\.','__')" />()),</xsl:when> + <xsl:when test="string(@event)!=''">QSignalTransition(this,SIGNAL(event_<xsl:value-of select="replace(@event,'\.','__')" /><xsl:if test="not(ends-with(@event,')'))">()</xsl:if>),</xsl:when> <xsl:otherwise>SCC_UnconditionalTransition(</xsl:otherwise></xsl:choose><xsl:apply-templates mode="stateid" select=".." />);<xsl:if test="count(*) != 0"> connect(transition,SIGNAL(triggered()),this,SLOT(exec_<xsl:value-of select="generate-id()" />()));</xsl:if> - <xsl:if test="string(@animation) != ''"> - (*transition).addAnimation(<xsl:value-of select="@animation" />);</xsl:if><xsl:if + <xsl:if test="string(@Qt:animation) != ''"> + transition->addAnimation(<xsl:value-of select="@Qt:animation" />);</xsl:if><xsl:if test="string(@target) != ''"></xsl:if> <xsl:choose> <xsl:when test="string(@target)=''" /> <xsl:when test="count(tokenize(@target,'\s+'))=1"> - (*transition).setTargetState(state_<xsl:value-of select="@target" />);</xsl:when> + transition->setTargetState(state_<xsl:value-of select="@target" />);</xsl:when> <xsl:otherwise>(*transition).setTargetStates(QList<QAbstractState*>()<xsl:for-each select="tokenize(@target,'\s+')"> << state_<xsl:value-of select="." /></xsl:for-each>);</xsl:otherwise> </xsl:choose> </xsl:for-each> - <xsl:for-each select="//onentry|//onexit"><xsl:if test="count(*) != 0"> + <xsl:for-each select="//s:history/s:transition"> + <xsl:apply-templates mode="stateid" select=".." />->setDefaultState(state_<xsl:value-of select="@target" />); + </xsl:for-each> + <xsl:for-each select="//s:onentry|//s:onexit"><xsl:if test="count(*) != 0"> connect(<xsl:apply-templates mode="stateid" select=".." />, SIGNAL(<xsl:choose> <xsl:when test="name()='onentry'">entered</xsl:when> <xsl:when test="name()='onexit'">exited</xsl:when> </xsl:choose>()),this,SLOT(exec_<xsl:value-of select="generate-id()" />()));</xsl:if></xsl:for-each> + <xsl:value-of select="/s:scxml/s:script/text()" /> } }; - <xsl:for-each select="//transition[string(@cond) != '']"> + <xsl:for-each select="//s:transition[@event='*' or string(@cond) != '']"> + <xsl:call-template name="comment" /> bool Transition_<xsl:value-of select="generate-id()" />::eventTest(QEvent* e) { - return Q<xsl:if test="string(@event) != ''">Signal</xsl:if>Transition::eventTest(e) - && stateMachine->testCondition_<xsl:value-of select="generate-id()" />(e?(*e):QEvent(QEvent::None)); + return <xsl:choose><xsl:when test="@event!='*'">Q<xsl:if test="string(@event) != ''">Signal</xsl:if>Transition::eventTest(e) + </xsl:when><xsl:otherwise>(*e).type() != QEvent::None</xsl:otherwise></xsl:choose><xsl:if test="string(@cond)!=''">&& stateMachine->testCondition_<xsl:value-of + select="generate-id()" />()</xsl:if>; } </xsl:for-each> #endif |