diff options
Diffstat (limited to 'src/designer/data/generate_header.xsl')
-rw-r--r-- | src/designer/data/generate_header.xsl | 169 |
1 files changed, 124 insertions, 45 deletions
diff --git a/src/designer/data/generate_header.xsl b/src/designer/data/generate_header.xsl index b5203d454..ec1ea7aa9 100644 --- a/src/designer/data/generate_header.xsl +++ b/src/designer/data/generate_header.xsl @@ -25,6 +25,26 @@ <xsl:template name="child-element-accessors"> <xsl:param name="node"/> + <xsl:variable name="set" select="$node/xs:sequence | $node/xs:choice | $node/xs:all"/> + <xsl:variable name="count" select="count($set)"/> + + <xsl:if test="$count > 0"> + <xsl:text> // child element accessors&endl;</xsl:text> + </xsl:if> + + <xsl:for-each select="$set"> + <xsl:call-template name="child-element-accessor"> + <xsl:with-param name="node" select="."/> + </xsl:call-template> + </xsl:for-each> + + </xsl:template> + +<!-- Class declaration: child element accessor --> + + <xsl:template name="child-element-accessor"> + <xsl:param name="node"/> + <xsl:variable name="isChoice" select="name($node)='xs:choice'"/> <xsl:if test="$isChoice"> @@ -48,7 +68,7 @@ <xsl:text> inline Kind kind() const { return m_kind; }&endl;&endl;</xsl:text> </xsl:if> - <xsl:for-each select="$node/xs:element"> + <xsl:for-each select="$node/xs:element[not(@use) or (@use!='deprecated')]"> <xsl:variable name="array" select="@maxOccurs='unbounded'"/> <xsl:variable name="camel-case-name"> <xsl:call-template name="camel-case"> @@ -81,7 +101,7 @@ <xsl:text> inline </xsl:text> <xsl:value-of select="$return-cpp-type"/> - <xsl:text> element</xsl:text> + <xsl:text>element</xsl:text> <xsl:value-of select="$cap-name"/> <xsl:text>() const { return m_</xsl:text> <xsl:value-of select="$camel-case-name"/> @@ -90,7 +110,7 @@ <xsl:if test="$xs-type-cat = 'pointer'"> <xsl:text> </xsl:text> <xsl:value-of select="$return-cpp-type"/> - <xsl:text> takeElement</xsl:text> + <xsl:text>takeElement</xsl:text> <xsl:value-of select="$cap-name"/> <xsl:text>();&endl;</xsl:text> </xsl:if> @@ -99,7 +119,7 @@ <xsl:value-of select="$cap-name"/> <xsl:text>(</xsl:text> <xsl:value-of select="$argument-cpp-type"/> - <xsl:text> a);&endl;</xsl:text> + <xsl:text>a);&endl;</xsl:text> <xsl:if test="not($isChoice) and not(@maxOccurs='unbounded')"> <xsl:text> inline bool hasElement</xsl:text> @@ -116,6 +136,31 @@ </xsl:for-each> </xsl:template> +<!-- Class declaration: child elements data --> + + <xsl:template name="child-elements-data"> + <xsl:param name="node"/> + + <xsl:variable name="set" select="$node/xs:sequence | $node/xs:choice | $node/xs:all"/> + <xsl:variable name="count" select="count($set)"/> + + <xsl:if test="boolean($node/xs:choice)"> + <xsl:text>&endl; // child element data&endl;</xsl:text> + <xsl:text> Kind m_kind = Unknown;&endl;</xsl:text> + </xsl:if> + <xsl:if test="not($node/xs:choice) and $count > 0"> + <xsl:text>&endl; // child element data&endl;</xsl:text> + <xsl:text> uint m_children = 0;&endl;</xsl:text> + </xsl:if> + + <xsl:for-each select="$set"> + <xsl:call-template name="child-element-data"> + <xsl:with-param name="node" select="."/> + </xsl:call-template> + </xsl:for-each> + + </xsl:template> + <!-- Class declaration: child element data --> <xsl:template name="child-element-data"> @@ -123,7 +168,7 @@ <xsl:variable name="isChoice" select="$node[name()='xs:choice']"/> - <xsl:for-each select="$node/xs:element"> + <xsl:for-each select="$node/xs:element[not(@use) or (@use!='deprecated')]"> <xsl:variable name="camel-case-name"> <xsl:call-template name="camel-case"> <xsl:with-param name="text" select="@name"/> @@ -137,15 +182,36 @@ </xsl:variable> <xsl:text> </xsl:text> <xsl:value-of select="$cpp-type"/> - <xsl:text> m_</xsl:text> + <xsl:text>m_</xsl:text> <xsl:value-of select="$camel-case-name"/> + + <xsl:variable name="array" select="@maxOccurs='unbounded'"/> + <xsl:if test="not($array)"> + <xsl:choose> + <xsl:when test="@type = 'xs:integer' or @type = 'xs:unsignedInt' or @type = 'xs:long' or @type = 'xs:unsignedLong'"> + <xsl:text> = 0</xsl:text> + </xsl:when> + <xsl:when test="@type = 'xs:double' or @type = 'xs:float'"> + <xsl:text> = 0.0</xsl:text> + </xsl:when> + <xsl:when test="@type = 'xs:boolean'"> + <xsl:text> = false</xsl:text> + </xsl:when> + <xsl:when test="@type = 'xs:string'"> + </xsl:when> + <xsl:otherwise> + <xsl:text> = nullptr</xsl:text> + </xsl:otherwise> + </xsl:choose> + </xsl:if> + <xsl:text>;&endl;</xsl:text> </xsl:for-each> <xsl:if test="not($isChoice) and not(@macOccurs='unbounded')"> - <xsl:text> enum Child {&endl;</xsl:text> - <xsl:for-each select="$node/xs:element"> - <xsl:variable name="camel-case-name"> + <xsl:text>&endl; enum Child {&endl;</xsl:text> + <xsl:for-each select="$node/xs:element[not(@use) or (@use!='deprecated')]"> + <xsl:variable name="camel-case-name"> <xsl:call-template name="camel-case"> <xsl:with-param name="text" select="@name"/> </xsl:call-template> @@ -174,7 +240,14 @@ <xsl:template name="attribute-accessors"> <xsl:param name="node"/> - <xsl:for-each select="$node/xs:attribute"> + <xsl:variable name="set" select="$node//xs:attribute"/> + <xsl:variable name="count" select="count($set)"/> + + <xsl:if test="$count > 0"> + <xsl:text> // attribute accessors&endl;</xsl:text> + </xsl:if> + + <xsl:for-each select="$set"> <xsl:variable name="camel-case-name"> <xsl:call-template name="camel-case"> <xsl:with-param name="text" select="@name"/> @@ -204,7 +277,7 @@ <xsl:text> inline </xsl:text> <xsl:value-of select="$cpp-return-type"/> - <xsl:text> attribute</xsl:text> + <xsl:text>attribute</xsl:text> <xsl:value-of select="$cap-name"/> <xsl:text>() const { return m_attr_</xsl:text> <xsl:value-of select="$camel-case-name"/> @@ -214,7 +287,7 @@ <xsl:value-of select="$cap-name"/> <xsl:text>(</xsl:text> <xsl:value-of select="$cpp-argument-type"/> - <xsl:text> a) { m_attr_</xsl:text> + <xsl:text>a) { m_attr_</xsl:text> <xsl:value-of select="$camel-case-name"/> <xsl:text> = a; m_has_attr_</xsl:text> <xsl:value-of select="$camel-case-name"/> @@ -233,8 +306,7 @@ <xsl:template name="class-declaration"> <xsl:param name="node"/> <xsl:variable name="name" select="concat('Dom', $node/@name)"/> -<!-- <xsl:variable name="hasText" select="$node[@mixed='true']"/>--> - <xsl:variable name="hasText" select="true()"/> + <xsl:variable name="hasText" select="$node[@mixed='true']"/> <xsl:text>class QDESIGNER_UILIB_EXPORT </xsl:text> <xsl:value-of select="$name"/> @@ -244,44 +316,44 @@ <xsl:text>public:&endl;</xsl:text> <xsl:text> </xsl:text> <xsl:value-of select="$name"/> - <xsl:text>();&endl;</xsl:text> + <xsl:text>() = default;&endl;</xsl:text> <xsl:text> ~</xsl:text> <xsl:value-of select="$name"/> <xsl:text>();&endl;&endl;</xsl:text> <xsl:text> void read(QXmlStreamReader &reader);&endl;</xsl:text> - <xsl:text> void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;&endl;</xsl:text> + <xsl:text> void write(QXmlStreamWriter &writer, const QString &tagName = QString()) const;&endl;&endl;</xsl:text> <xsl:if test="$hasText"> <xsl:text> inline QString text() const { return m_text; }&endl;</xsl:text> - <xsl:text> inline void setText(const QString &s) { m_text = s; }&endl;</xsl:text> + <xsl:text> inline void setText(const QString &s) { m_text = s; }&endl;&endl;</xsl:text> </xsl:if> - <xsl:text>&endl;</xsl:text> - - <xsl:text> // attribute accessors&endl;</xsl:text> <xsl:call-template name="attribute-accessors"> <xsl:with-param name="node" select="$node"/> </xsl:call-template> - <xsl:text> // child element accessors&endl;</xsl:text> - - <xsl:for-each select="$node/xs:sequence | $node/xs:choice | $node/xs:all"> - <xsl:call-template name="child-element-accessors"> - <xsl:with-param name="node" select="."/> - </xsl:call-template> - </xsl:for-each> + <xsl:call-template name="child-element-accessors"> + <xsl:with-param name="node" select="$node"/> + </xsl:call-template> <xsl:text>private:&endl;</xsl:text> <xsl:if test="$hasText"> - <xsl:text> QString m_text;&endl;</xsl:text> + <xsl:text> QString m_text;&endl;&endl;</xsl:text> </xsl:if> - <xsl:text> void clear(bool clear_all = true);&endl;&endl;</xsl:text> + <xsl:if test="boolean($node/xs:choice)"> + <xsl:text> void clear();&endl;&endl;</xsl:text> + </xsl:if> - <xsl:text> // attribute data&endl;</xsl:text> - <xsl:for-each select="$node/xs:attribute"> + <xsl:variable name="set" select="$node//xs:attribute"/> + <xsl:variable name="count" select="count($set)"/> + + <xsl:if test="$count > 0"> + <xsl:text> // attribute data&endl;</xsl:text> + </xsl:if> + <xsl:for-each select="$set"> <xsl:variable name="camel-case-name"> <xsl:call-template name="camel-case"> <xsl:with-param name="text" select="@name"/> @@ -296,25 +368,31 @@ <xsl:value-of select="$cpp-type"/> <xsl:text> m_attr_</xsl:text> <xsl:value-of select="$camel-case-name"/> + + <xsl:choose> + <xsl:when test="@type = 'xs:integer'"> + <xsl:text> = 0</xsl:text> + </xsl:when> + <xsl:when test="@type = 'xs:double' or @type = 'xs:float'"> + <xsl:text> = 0.0</xsl:text> + </xsl:when> + <xsl:when test="@type = 'xs:boolean'"> + <xsl:text> = false</xsl:text> + </xsl:when> + </xsl:choose> + <xsl:text>;&endl;</xsl:text> <xsl:text> bool m_has_attr_</xsl:text> <xsl:value-of select="$camel-case-name"/> - <xsl:text>;&endl;&endl;</xsl:text> + <xsl:text> = false;&endl;</xsl:text> + <xsl:if test="position()!=last()"> + <xsl:text>&endl;</xsl:text> + </xsl:if> </xsl:for-each> - <xsl:text> // child element data&endl;</xsl:text> - <xsl:if test="boolean($node/xs:choice)"> - <xsl:text> Kind m_kind;&endl;</xsl:text> - </xsl:if> - <xsl:if test="not($node/xs:choice)"> - <!-- TODO: if there are no elements with maxOccurs='1', m_children is never used--> - <xsl:text> uint m_children;&endl;</xsl:text> - </xsl:if> - <xsl:for-each select="$node/xs:sequence | $node/xs:choice | $node/xs:all"> - <xsl:call-template name="child-element-data"> - <xsl:with-param name="node" select="."/> - </xsl:call-template> - </xsl:for-each> + <xsl:call-template name="child-elements-data"> + <xsl:with-param name="node" select="$node"/> + </xsl:call-template> <xsl:text>};&endl;&endl;</xsl:text> </xsl:template> @@ -381,6 +459,7 @@ #include <qlist.h> #include <qstring.h> #include <qstringlist.h> +#include <qvector.h> #include <qxmlstream.h> #include <qglobal.h> |