--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysmodellibs/sysmodelgen/core/legend.xsl Wed Oct 13 16:21:25 2010 +0100
@@ -0,0 +1,333 @@
+<?xml version="1.0"?>
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns="http://www.w3.org/2000/svg" xmlns:s="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:exslt="http://exslt.org/common" exclude-result-prefixes="s exslt" >
+
+<!-- title of the model -->
+<xsl:template mode="title" match="SystemDefinition">
+ <title>
+ <xsl:call-template name="title-line1"/>
+ <xsl:variable name="t2"><xsl:call-template name="title-line2"/></xsl:variable>
+ <xsl:variable name="t3"><xsl:call-template name="title-line3"/></xsl:variable>
+ <xsl:if test="$t2!=''"><xsl:value-of select="concat(' ',$t2)"/></xsl:if>
+ <xsl:if test="$t3!=''"><xsl:value-of select="concat(': ',$t3)"/></xsl:if>
+ </title>
+</xsl:template>
+
+
+
+<xsl:template match="meta[@rel='model-logo']" mode="global">
+ <xsl:param name="bottom"/>
+ <xsl:for-each select="logo">
+ <g class="logo">
+ <xsl:attribute name="transform">translate(0 <xsl:value-of select="$bottom"/>) <xsl:if test="@viewBox">
+ <xsl:variable name="b" select="normalize-space(@viewBox)"/>
+ <xsl:variable name="x0" select="- number(substring-before($b,' '))"/>
+ <xsl:variable name="y0" select="- number(substring-before(substring-after($b,' '),' '))"/>
+ <xsl:variable name="x1" select="number(substring-before(substring-after(substring-after($b,' '),' '),' '))"/>
+ <xsl:variable name="y1" select="number(substring-after(substring-after(substring-after($b,' '),' '),' '))"/>
+ <xsl:text> scale(</xsl:text>
+ <xsl:if test="@width"><xsl:value-of select="number(@width) div ($x1 + $x0)"/></xsl:if>
+ <xsl:if test="@height">
+ <xsl:text> </xsl:text><xsl:value-of select="@height div ($y1 + $y0)"/>
+ </xsl:if>
+ <xsl:if test="not(@width | @height)">1</xsl:if>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="not($x0=0 and $y0=0)"> translate(<xsl:value-of select="concat($x0,' ', $y0)"/>)</xsl:if>
+ </xsl:if></xsl:attribute>
+ <xsl:choose>
+ <xsl:when test="@src">
+ <image x="0" y="0" width="{@width}" height="{@height}" xlink:href="{@src}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="*"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </g>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="meta[@rel='model-footer' and *]" mode="global">
+ <xsl:variable name="copyright">
+ <xsl:apply-templates select="ancestor::SystemDefinition/@copyright" mode="as-text"/>
+ </xsl:variable>
+ <xsl:variable name="distribution">
+ <xsl:apply-templates select="ancestor::SystemDefinition/@distribution" mode="as-text"/>
+ </xsl:variable>
+ <g class="footer" transform="translate(0 {ancestor::SystemDefinition/@height - @height})">
+ <xsl:if test="$copyright != '' and copyright">
+ <text text-anchor="start" class="lgd" x="0" y="{@height}" style="font-weight: normal"><xsl:value-of select="$copyright"/></text>
+ </xsl:if>
+ <xsl:if test="$distribution !='' and distribution">
+ <text text-anchor="middle" class="lgd" x="{ancestor::SystemDefinition/@width *0.5}" y="{@height}" style="font-weight: normal"><xsl:value-of select="$distribution"/></text>
+ </xsl:if>
+ </g>
+</xsl:template>
+
+
+<!--
+Baisc rules:
+ No <legend> means no legend will be generated and no title will appear
+ An empty <legend/> means only the model title will appear.
+ A legend with content will generate the legend as requested. The legend lable only appears if the legend has content
+-->
+<xsl:template match="meta[@rel='model-legend']" mode="global">
+ <xsl:param name="bottom"/>
+ <xsl:variable name="lw" select="@width div @scaled"/> <!-- width of whole legend area without scaling -->
+ <xsl:for-each select="legend">
+ <xsl:variable name="h" select="(@height | @min-height)"/>
+ <xsl:variable name="w">
+ <xsl:apply-templates select="." mode="actual-width">
+ <xsl:with-param name="h" select="$h - @ipad"/>
+ </xsl:apply-templates>
+ </xsl:variable>
+
+ <g id="legend-root" class="legend" transform="translate({ancestor::SystemDefinition/@width - $lw} {$bottom}) translate({$lw} {0}) scale({../@scaled}) translate({- $lw})">
+
+ <!-- draw the model title -->
+ <xsl:apply-templates select="ancestor::SystemDefinition" mode="legend-label">
+ <xsl:with-param name="x" select="$lw - (@title-width * 0.5)"/>
+ <xsl:with-param name="y" select="0"/>
+ </xsl:apply-templates>
+
+ <xsl:if test="*"> <!-- only draw if there is some legend content -->
+ <g id="legend-box"><!-- legend-box is the rectangle container of all generated legend content (ie not the title)-->
+ <xsl:if test="not(@static='true') and @float">
+ <xsl:attribute name="onmouseout">movelegend('legend-root')</xsl:attribute>
+ </xsl:if>
+ <rect class="legend" rx="{@ipad}" ry="{@ipad}" height="{$h}" width="{$w}" x="0" y="0"/>
+ <g transform="translate({@ipad} {@ipad * 0.5})">
+ <xsl:apply-templates select="@label|*">
+ <xsl:with-param name="h" select="$h - @ipad"/>
+ </xsl:apply-templates>
+ </g>
+ </g>
+ </xsl:if>
+ </g>
+ <xsl:if test="not(@static='true') and @float">
+ <g id="legend-display" class="legend" transform="translate({ancestor::SystemDefinition/@width - $lw} {$bottom})" opacity="0.8">
+ <g id="legend-owner">
+ <rect id="legend-ctrl" rx="{@ipad}" ry="{@ipad}" height="{$h}" width="{$w}" x="0" y="0" visibility="hidden" pointer-events="all">
+ <xsl:attribute name="onmouseover">movelegend('legend-owner')</xsl:attribute>
+ </rect>
+ </g>
+ </g>
+ </xsl:if>
+ </xsl:for-each>
+</xsl:template>
+
+
+<xsl:template match="@label"><xsl:param name="h"/>
+ <text text-anchor="start" class="lgd" dy="0.375em" x="0">
+ <xsl:attribute name="y"><xsl:value-of select="$h div 2 "/></xsl:attribute>
+ <xsl:for-each select=".."><xsl:call-template name="display-name"/></xsl:for-each>
+ </text>
+</xsl:template>
+
+<xsl:template match="note"><xsl:param name="h"/>
+ <xsl:variable name="off">
+ <xsl:apply-templates select="." mode="x-pos">
+ <xsl:with-param name="h" select="$h"/>
+ </xsl:apply-templates>
+ </xsl:variable>
+ <xsl:variable name="newlines" select="string-length(.) - string-length(translate(.,'
',''))"/>
+ <text text-anchor="middle" class="label" dy="0.375em" x="{$off + 0.5* @width}" y="{$h div 2}">
+ <xsl:copy-of select="@style|@class"/>
+ <xsl:call-template name="multiline">
+ <xsl:with-param name="x" select="$off + 0.5* @width"/>
+ <xsl:with-param name="n" select="-0.5 * $newlines"/>
+ <xsl:with-param name="t">
+ <xsl:apply-templates select="." mode="eval-label"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </text>
+</xsl:template>
+
+
+<xsl:template match="SystemDefinition" mode="legend-label">
+ <xsl:param name="x"/>
+ <xsl:param name="y"/>
+ <text text-anchor="middle" class="title" x="{$x}" y="{$y}">
+ <tspan dy="0.75em" x="{$x}">
+ <xsl:call-template name="title-line1"/>
+ </tspan>
+ <tspan dy="1em" x="{$x}">
+ <xsl:call-template name="title-line2"/>
+ </tspan>
+ <tspan font-style="italic" dy="1em" id="release-version" x="{$x}">
+ <!-- show nothing if nothing specified, but leave tspan in case later need for it -->
+ <xsl:variable name="t3"><xsl:call-template name="title-line3"/></xsl:variable>
+ <xsl:if test="@revision and starts-with($t3,'DRAFT') or (@revision-type and not(@revision))">
+ <!-- draft is in uppercase, but not bold font -->
+ <!-- or if it's just the type with no value, put in non-bold font. -->
+ <xsl:attribute name="font-weight">normal</xsl:attribute>
+ </xsl:if>
+ <xsl:value-of select="$t3"/>
+ </tspan>
+ </text>
+</xsl:template>
+
+
+
+<xsl:template match="legend|note" mode="x-pos"><xsl:param name="h"/>
+ <xsl:variable name="x" select="sum(preceding-sibling::*/@width | preceding-sibling::*/@rpad | parent::legend[parent::meta]/@label-width)"/>
+ <xsl:choose>
+ <xsl:when test="preceding-sibling::*[not(@width)]">
+ <xsl:call-template name="sum-list">
+ <xsl:with-param name="list">
+ <xsl:value-of select="concat($x, ' ')"/>
+ <xsl:for-each select="preceding-sibling::*[not(@width)]">
+ <xsl:apply-templates select="." mode="actual-width">
+ <xsl:with-param name="h" select="$h"/>
+ </xsl:apply-templates>
+ <xsl:text> </xsl:text>
+ </xsl:for-each>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$x"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+
+<xsl:template match="legend"><xsl:param name="h"/>
+ <g>
+ <xsl:attribute name="transform">translate(<xsl:apply-templates select="." mode="x-pos">
+ <xsl:with-param name="h" select="$h"/>
+ </xsl:apply-templates> 0)</xsl:attribute>
+ <xsl:variable name="name"><xsl:call-template name="name-value"/></xsl:variable>
+ <xsl:if test="$name!=''">
+ <text text-anchor="end" class="label" dy="0.375em" x="{@label-width - 1.5}" y="{$h div 2}">
+ <xsl:attribute name="width"><xsl:value-of select="@label-width - 1.5"/></xsl:attribute>
+ <xsl:if test="@font"><xsl:attribute name="style">font-family: '<xsl:value-of select="@font"/>'</xsl:attribute></xsl:if>
+ <xsl:value-of select="$name"/>:</text>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="@sort='yes'">
+ <xsl:apply-templates select="*| key('ldg-use',@use)/*[@lookup or @label]">
+ <xsl:sort select="concat(@label,@lookup)"/>
+ <xsl:with-param name="h" select="$h"/> <!-- available height -->
+ <xsl:with-param name="y" select="0"/> <!-- vertical offset -->
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*| key('ldg-use',@use)/*[@lookup or @label]">
+ <xsl:with-param name="h" select="$h"/> <!-- available height -->
+ <xsl:with-param name="y" select="0"/> <!-- vertical offset -->
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </g>
+</xsl:template>
+
+<xsl:template match="legend/cbox|group/cbox"><xsl:param name="h"/><!-- can only have one type per legend -->
+ <xsl:variable name="rows" select="floor(($h+0.0001) div $cboxHeight)"/> <!-- avoid rounding errors -->
+ <xsl:variable name="total" select="last()"/>
+ <xsl:variable name="cols" select="ceiling($total div $rows)"/>
+ <xsl:variable name="dy" select="($h - floor(1 + ($total - 1) div $cols) * $cboxHeight) div 2"/>
+ <xsl:variable name="index" select="position() - 1"/>
+
+ <g id="{@id|@style-id}">
+ <!-- id used for mouseover animations -->
+ <rect class="cbox" height="{$cboxHeight}" width="{$cboxWidth}">
+ <xsl:apply-templates select="." mode="color"/>
+ <xsl:attribute name="x"><xsl:value-of select="sum(../@label-width) + $cboxWidth * ($index mod $cols)"/></xsl:attribute>
+ <xsl:attribute name="y"><xsl:value-of select="$dy + floor($index div $cols) * $cboxHeight"/></xsl:attribute>
+ </rect>
+ <text text-anchor="middle" class="cbox" width="{$cboxWidth}" dy="0.375em">
+ <xsl:attribute name="x"><xsl:value-of select="sum(../@label-width) + $cboxWidth * (($index mod $cols) + 0.5)"/></xsl:attribute>
+ <xsl:attribute name="y"><xsl:value-of select="$dy + ( 0.5 + floor($index div $cols)) * $cboxHeight"/></xsl:attribute>
+ <xsl:if test="@font"><xsl:attribute name="style">font-family: '<xsl:value-of select="@font"/>'</xsl:attribute></xsl:if>
+ <xsl:apply-templates mode="name" select="."/>
+ </text>
+ </g>
+</xsl:template>
+
+
+<!-- for drawing generated legend items -->
+
+
+<xsl:template match="*" mode="color"><xsl:attribute name="fill"><xsl:value-of select="@color"/></xsl:attribute></xsl:template>
+<xsl:template match="cbox" mode="color"><xsl:attribute name="fill"><xsl:value-of select="@value"/></xsl:attribute></xsl:template>
+
+<xsl:template match="cbox" mode="id">color-<xsl:value-of select="concat(name(),'-',count(preceding::cbox))"/></xsl:template>
+<xsl:template match="cmp" mode="id">style-<xsl:value-of select="concat(name(),'-',count(preceding::cmp))"/></xsl:template>
+<xsl:template match="*[@style-id]" mode="id"><xsl:value-of select="concat(name(),'-',@style-id)"/></xsl:template>
+
+
+
+<xsl:template match="cmp" mode="display-style">
+ <xsl:variable name="color"><xsl:apply-templates select="." mode="display-style-color"/></xsl:variable>
+ <xsl:if test="$color!=''">fill:<xsl:value-of select="$color"/>;</xsl:if>
+ <xsl:for-each select="@generated-style | generated-style/@value"><xsl:value-of select="."/>;</xsl:for-each>
+ <xsl:apply-templates select="." mode="display-style-aux"/>
+</xsl:template>
+
+<xsl:template match="cmp[@generated-color]" mode="display-style-color" priority="8"><!-- colour in legend -->
+ <xsl:value-of select="@generated-color"/>
+</xsl:template>
+
+<xsl:template match="cmp[@generated-overlay|generated-overlay]" mode="overlays" priority="8">
+ <xsl:for-each select="@generated-overlay|generated-overlay/@ref">
+ <o><xsl:value-of select="."/></o>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="cmp[@generated-border]" mode="shape" priority="8">
+ <xsl:value-of select="@generated-border"/>
+</xsl:template>
+
+<xsl:template match="cmp[@generated-text-highlight]" mode="text-filter" priority="8">
+ <xsl:attribute name="filter">url(<xsl:value-of select="@generated-text-highlight"/>)</xsl:attribute>
+</xsl:template>
+
+<xsl:template match="cmp[@generated-highlight]" mode="filter" priority="8">
+ <xsl:attribute name="filter">url(<xsl:value-of select="@generated-highlight"/>)</xsl:attribute>
+</xsl:template>
+
+
+<xsl:template match="group[@type='border']/cmp[@value]" mode="shape">
+ <xsl:value-of select="@value"/>
+</xsl:template>
+
+<xsl:template match="group[@type='overlay']/cmp[@value]" mode="overlays">
+ <o><xsl:value-of select="@value"/></o>
+</xsl:template>
+
+<xsl:template match="group[@type='style']/cmp[@value]" mode="display-style-aux" priority="6">
+ <xsl:value-of select="@value"/>;</xsl:template>
+
+<xsl:template match="group[@type='text-highlight']/cmp[@value]" mode="text-filter" priority="8">
+ <xsl:attribute name="filter">url(<xsl:value-of select="@value"/>)</xsl:attribute>
+</xsl:template>
+
+<xsl:template match="group[@type='highlight']/cmp[@value]" mode="filter" priority="8">
+ <xsl:attribute name="filter">url(<xsl:value-of select="@value"/>)</xsl:attribute>
+</xsl:template>
+
+
+<!-- end legend items -->
+
+<xsl:template name="multiline"> <!-- draw text with newlines -->
+ <xsl:param name="x" select="0"/> <!-- anchor point -->
+ <xsl:param name="n" select="1"/> <!-- spacing: default is single-spaced -->
+ <xsl:param name="t" select="."/> <!-- the text to draw -->
+<xsl:choose>
+ <xsl:when test="contains($t,'
')">
+ <tspan dy="{$n}em" x="{$x}">
+ <xsl:value-of select="normalize-space(substring-before($t,'
'))"/></tspan>
+ <xsl:call-template name="multiline">
+ <xsl:with-param name="x" select="$x"/>
+ <xsl:with-param name="t" select="substring-after($t,'
')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <tspan dy="{$n}em" x="{$x}"><xsl:value-of select="normalize-space($t)"/></tspan>
+ </xsl:otherwise>
+</xsl:choose>
+</xsl:template>
+
+
+</xsl:stylesheet>
+
+
\ No newline at end of file