📄 maketree.xsl
字号:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Template: MakeTree.xsl
Outputs the diagram tree
-->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/2000/svg" xmlns:UML="org.omg.xmi.namespace.UML">
<xsl:output media-type="image/svg+xml" method="xml" indent="yes"/>
<!-- MakeTreeScript -->
<xsl:template name="MakeTree">
<script type="text/ecmascript"><xsl:text disable-output-escaping="yes"><![CDATA[<![CDATA[
/*****
*
* AntiZoomAndPan.js
*
* copyright 2002, Kevin Lindsey
*
*****/
AntiZoomAndPan.VERSION = "1.2"
/*****
*
* constructor
*
*****/
function AntiZoomAndPan() {
this.init();
}
/*****
*
* init
*
*****/
AntiZoomAndPan.prototype.init = function() {
var svgRoot = svgDocument.documentElement;
// Initialize properties;
this.svgNodes = new Array();
this.x_trans = 0;
this.y_trans = 0;
this.scale = 1;
this.lastTM = svgRoot.createSVGMatrix();
// Setup event listeners to capture zoom and scroll events
svgRoot.addEventListener('SVGZoom', this, false);
svgRoot.addEventListener('SVGScroll', this, false);
svgRoot.addEventListener('SVGResize', this, false);
};
/*****
*
* appendNode
*
*****/
AntiZoomAndPan.prototype.appendNode = function(svgNode) {
// Add node to a array
this.svgNodes.push(svgNode);
};
/*****
*
* removeNode
*
*****/
AntiZoomAndPan.prototype.removeNode = function(svgNode) {
// Remove node if found
for ( var i = 0; i < this.svgNodes.length; i++ ) {
if ( this.svgNodes[i] === svgNode ) {
this.svgNodes.splice(i, 1);
break;
}
}
};
/*****
*
* Event Handlers
*
*****/
/*****
*
* handleEvent
*
*****/
AntiZoomAndPan.prototype.handleEvent = function(e) {
var type = e.type;
if ( this[type] == null )
throw new Error("Unsupported event type: " + type);
this[type](e);
};
/*****
*
* SVGZoom
*
*****/
AntiZoomAndPan.prototype.SVGZoom = function(e) {
// Update current transform
this.update();
};
/*****
*
* SVGScroll
*
*****/
AntiZoomAndPan.prototype.SVGScroll = function(e) {
// Update current transform
this.update();
};
/*****
*
* SVGResize
*
*****/
AntiZoomAndPan.prototype.SVGResize = function(e) {
// Update current transform
this.update();
};
/*****
*
* update
*
*****/
AntiZoomAndPan.prototype.update = function() {
if ( this.svgNodes.length > 0 ) {
var svgRoot = svgDocument.documentElement;
var viewbox = ( window.ViewBox != null )
? new ViewBox(svgRoot)
: null;
var matrix = ( viewbox != null )
? viewbox.getTM()
: svgRoot.createSVGMatrix();
var trans = svgRoot.currentTranslate;
// Set the scale factor to leave object at original size
matrix = matrix.scale( 1.0 / svgRoot.currentScale);
// Get the current pan settings
matrix = matrix.translate(-trans.x, -trans.y);
// Apply combined transforms to all managed nodes
for ( var i = 0; i < this.svgNodes.length; i++ ) {
var node = this.svgNodes[i];
var CTM = matrix.multiply( this.lastTM.multiply(node.getCTM()) );
var transform = "matrix(" +
[ CTM.a, CTM.b, CTM.c,
CTM.d, CTM.e, CTM.f ].join(",") + ")";
this.svgNodes[i].setAttributeNS(null, "transform", transform);
}
this.lastTM = matrix.inverse();
}
};
]]>]]>
</xsl:text>
</script>
<script><xsl:text disable-output-escaping="yes"><![CDATA[<![CDATA[
var azap = new AntiZoomAndPan();
function initAzap(e) {
if ( window.svgDocument == null )
svgDocument = e.target.ownerDocument;
var Tree = svgDocument.getElementById("DiagramTree");
azap.appendNode(Tree);
// This update is need to initialize all mananged nodes
// Really this is a hack to get around this "feature" of the code
azap.update();
}
]]>]]>
</xsl:text>
</script>
<!-- Main Tree group -->
<g id="DiagramTree">
<svg width="200" font-weight="bold" font-size="13" fill="#FFFFE3" onload="initAzap();">
<!-- Background -->
<rect width="200" height="100%" fill="black" stroke="none" stroke-width="2"/>
<!-- Tree root -->
<a><text>
<tspan id="TreeRootP" x="10" dy="20" onclick="show('TreeRoot')">+</tspan>
<tspan id="TreeRootM" x="10" dy="20" display="none" onclick="hide('TreeRoot')">-</tspan>
<tspan x="20" dy="0" onclick="treeNodeClick('TreeRoot')"><xsl:value-of select="//UML:Model/@name"/></tspan>
<tspan id="TreeRoot" display="none">
<!-- Contained Class diagrams -->
<xsl:if test="/XMI/XMI.content/UML:Diagram[UML:GraphElement.semanticModel/UML:SimpleSemanticModelElement/@typeInfo = 'ClassDiagram']">
<tspan id="ClassDiagramsP" x="20" dy="20" onclick="show('ClassDiagrams')">+</tspan>
<tspan id="ClassDiagramsM" x="20" dy="20" display="none" onclick="hide('ClassDiagrams')">-</tspan>
<tspan x="30" dy="0" onclick="treeNodeClick('ClassDiagrams')">Class Diagrams</tspan>
<tspan id="ClassDiagrams" display="none">
<xsl:for-each select="/XMI/XMI.content/UML:Diagram[UML:GraphElement.semanticModel/UML:SimpleSemanticModelElement/@typeInfo = 'ClassDiagram']">
<tspan id="{@xmi.id}T" x="40" dy="20" onclick="showDiagram('{@xmi.id}')" onmouseover="document.getElementById('{@xmi.id}T').setAttribute('fill', '#FFF')" onmouseout="document.getElementById('{@xmi.id}T').setAttribute('fill', '#FFFFE3')"><xsl:value-of select="@name"/></tspan>
</xsl:for-each>
</tspan>
</xsl:if>
<!-- Contained UseCase diagrams -->
<xsl:if test="/XMI/XMI.content/UML:Diagram[UML:GraphElement.semanticModel/UML:SimpleSemanticModelElement/@typeInfo = 'UseCaseDiagram']">
<tspan id="UseCaseDiagramsP" x="20" dy="20" onclick="show('UseCaseDiagrams')">+</tspan>
<tspan id="UseCaseDiagramsM" x="20" dy="20" display="none" onclick="hide('UseCaseDiagrams')">-</tspan>
<tspan x="30" dy="0" onclick="treeNodeClick('UseCaseDiagrams')">UseCase Diagrams</tspan>
<tspan id="UseCaseDiagrams" display="none">
<xsl:for-each select="/XMI/XMI.content/UML:Diagram[UML:GraphElement.semanticModel/UML:SimpleSemanticModelElement/@typeInfo = 'UseCaseDiagram']">
<tspan id="{@xmi.id}T" x="40" dy="20" onclick="showDiagram('{@xmi.id}')" onmouseover="document.getElementById('{@xmi.id}T').setAttribute('fill', '#FFF')" onmouseout="document.getElementById('{@xmi.id}T').setAttribute('fill', '#FFFFE3')"><xsl:value-of select="@name"/></tspan>
</xsl:for-each>
</tspan>
</xsl:if>
<!-- Contained State diagrams -->
<xsl:if test="/XMI/XMI.content/UML:Diagram[UML:GraphElement.semanticModel/UML:SimpleSemanticModelElement/@typeInfo = 'StateDiagram']">
<tspan id="StateDiagramsP" x="20" dy="20" onclick="show('StateDiagrams')">+</tspan>
<tspan id="StateDiagramsM" x="20" dy="20" display="none" onclick="hide('StateDiagrams')">-</tspan>
<tspan x="30" dy="0" onclick="treeNodeClick('StateDiagrams')">State Diagrams</tspan>
<tspan id="StateDiagrams" display="none">
<xsl:for-each select="/XMI/XMI.content/UML:Diagram[UML:GraphElement.semanticModel/UML:SimpleSemanticModelElement/@typeInfo = 'StateDiagram']">
<tspan id="{@xmi.id}T" x="40" dy="20" onclick="showDiagram('{@xmi.id}')" onmouseover="document.getElementById('{@xmi.id}T').setAttribute('fill', '#FFF')" onmouseout="document.getElementById('{@xmi.id}T').setAttribute('fill', '#FFFFE3')"><xsl:value-of select="@name"/></tspan>
</xsl:for-each>
</tspan>
</xsl:if>
<!-- Contained Activity diagrams -->
<xsl:if test="/XMI/XMI.content/UML:Diagram[UML:GraphElement.semanticModel/UML:SimpleSemanticModelElement/@typeInfo = 'ActivityDiagram']">
<tspan id="ActivityDiagramsP" x="20" dy="20" onclick="show('ActivityDiagrams')">+</tspan>
<tspan id="ActivityDiagramsM" x="20" dy="20" display="none" onclick="hide('ActivityDiagrams')">-</tspan>
<tspan x="30" dy="0" onclick="treeNodeClick('ActivityDiagrams')">Activity Diagrams</tspan>
<tspan id="ActivityDiagrams" display="none">
<xsl:for-each select="/XMI/XMI.content/UML:Diagram[UML:GraphElement.semanticModel/UML:SimpleSemanticModelElement/@typeInfo = 'ActivityDiagram']">
<tspan id="{@xmi.id}T" x="40" dy="20" onclick="showDiagram('{@xmi.id}')" onmouseover="document.getElementById('{@xmi.id}T').setAttribute('fill', '#FFF')" onmouseout="document.getElementById('{@xmi.id}T').setAttribute('fill', '#FFFFE3')"><xsl:value-of select="@name"/></tspan>
</xsl:for-each>
</tspan>
</xsl:if>
<!-- Contained Collaboration diagrams -->
<xsl:if test="/XMI/XMI.content/UML:Diagram[UML:GraphElement.semanticModel/UML:SimpleSemanticModelElement/@typeInfo = 'CollaborationDiagram']">
<tspan id="CollaborationDiagramsP" x="20" dy="20" onclick="show('CollaborationDiagrams')">+</tspan>
<tspan id="CollaborationDiagramsM" x="20" dy="20" display="none" onclick="hide('CollaborationDiagrams')">-</tspan>
<tspan x="30" dy="0" onclick="treeNodeClick('CollaborationDiagrams')">Collaboration Diagrams</tspan>
<tspan id="CollaborationDiagrams" display="none">
<xsl:for-each select="/XMI/XMI.content/UML:Diagram[UML:GraphElement.semanticModel/UML:SimpleSemanticModelElement/@typeInfo = 'CollaborationDiagram']">
<tspan id="{@xmi.id}T" x="40" dy="20" onclick="showDiagram('{@xmi.id}')" onmouseover="document.getElementById('{@xmi.id}T').setAttribute('fill', '#FFF')" onmouseout="document.getElementById('{@xmi.id}T').setAttribute('fill', '#FFFFE3')"><xsl:value-of select="@name"/></tspan>
</xsl:for-each>
</tspan>
</xsl:if>
<!-- Contained Sequence diagrams -->
<xsl:if test="/XMI/XMI.content/UML:Diagram[UML:GraphElement.semanticModel/UML:SimpleSemanticModelElement/@typeInfo = 'SequenceDiagram']">
<tspan id="SequenceDiagramsP" x="20" dy="20" onclick="show('SequenceDiagrams')">+</tspan>
<tspan id="SequenceDiagramsM" x="20" dy="20" display="none" onclick="hide('SequenceDiagrams')">-</tspan>
<tspan x="30" dy="0" onclick="treeNodeClick('SequenceDiagrams')">Sequence Diagrams</tspan>
<tspan id="SequenceDiagrams" display="none">
<xsl:for-each select="/XMI/XMI.content/UML:Diagram[UML:GraphElement.semanticModel/UML:SimpleSemanticModelElement/@typeInfo = 'SequenceDiagram']">
<tspan id="{@xmi.id}T" x="40" dy="20" onclick="showDiagram('{@xmi.id}')" onmouseover="document.getElementById('{@xmi.id}T').setAttribute('fill', '#FFF')" onmouseout="document.getElementById('{@xmi.id}T').setAttribute('fill', '#FFFFE3')"><xsl:value-of select="@name"/></tspan>
</xsl:for-each>
</tspan>
</xsl:if>
<!-- Contained Deployment diagrams -->
<xsl:if test="/XMI/XMI.content/UML:Diagram[UML:GraphElement.semanticModel/UML:SimpleSemanticModelElement/@typeInfo = 'DeploymentDiagram']">
<tspan id="DeploymentDiagramsP" x="20" dy="20" onclick="show('DeploymentDiagrams')">+</tspan>
<tspan id="DeploymentDiagramsM" x="20" dy="20" display="none" onclick="hide('DeploymentDiagrams')">-</tspan>
<tspan x="30" dy="0" onclick="treeNodeClick('DeploymentDiagrams')">Deployment Diagrams</tspan>
<tspan id="DeploymentDiagrams" display="none">
<xsl:for-each select="/XMI/XMI.content/UML:Diagram[UML:GraphElement.semanticModel/UML:SimpleSemanticModelElement/@typeInfo = 'DeploymentDiagram']">
<tspan id="{@xmi.id}T" x="40" dy="20" onclick="showDiagram('{@xmi.id}')" onmouseover="document.getElementById('{@xmi.id}T').setAttribute('fill', '#FFF')" onmouseout="document.getElementById('{@xmi.id}T').setAttribute('fill', '#FFFFE3')"><xsl:value-of select="@name"/></tspan>
</xsl:for-each>
</tspan>
</xsl:if>
</tspan>
</text></a>
</svg>
</g>
</xsl:template>
</xsl:stylesheet>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -