Index: trunk/src/com/kitfox/svg/Use.java
===================================================================
--- trunk/src/com/kitfox/svg/Use.java	(revision 4256)
+++ trunk/src/com/kitfox/svg/Use.java	(revision 6002)
@@ -1,29 +1,37 @@
 /*
- * LinearGradient.java
- *
- *
- *  The Salamander Project - 2D and 3D graphics libraries in Java
- *  Copyright (C) 2004 Mark McKay
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- *  Mark McKay can be contacted at mark@kitfox.com.  Salamander and other
- *  projects can be found at http://www.kitfox.com
+ * SVG Salamander
+ * Copyright (c) 2004, Mark McKay
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or 
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *   - Redistributions of source code must retain the above 
+ *     copyright notice, this list of conditions and the following
+ *     disclaimer.
+ *   - Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the following
+ *     disclaimer in the documentation and/or other materials 
+ *     provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE. 
+ * 
+ * Mark McKay can be contacted at mark@kitfox.com.  Salamander and other
+ * projects can be found at http://www.kitfox.com
  *
  * Created on January 26, 2004, 1:54 AM
  */
-
 package com.kitfox.svg;
 
@@ -39,46 +47,59 @@
  * @author <a href="mailto:mark@kitfox.com">Mark McKay</a>
  */
-public class Use extends ShapeElement {
-
+public class Use extends ShapeElement
+{
+    public static final String TAG_NAME = "use";
+    
     float x = 0f;
     float y = 0f;
     float width = 1f;
     float height = 1f;
-
-    SVGElement href = null;
-
+//    SVGElement href = null;
+    URI href = null;
     AffineTransform refXform;
 
-    /** Creates a new instance of LinearGradient */
-    public Use() {
-    }
-/*
-    public void loaderStartElement(SVGLoaderHelper helper, Attributes attrs, SVGElement parent)
-    {
-		//Load style string
-        super.loaderStartElement(helper, attrs, parent);
-
-        String x = attrs.getValue("x");
-        String y = attrs.getValue("y");
-        String width = attrs.getValue("width");
-        String height = attrs.getValue("height");
-        String href = attrs.getValue("xlink:href");
-
-        if (x != null) this.x = (float)XMLParseUtil.parseRatio(x);
-        if (y != null) this.y = (float)XMLParseUtil.parseRatio(y);
-        if (width != null) this.width = (float)XMLParseUtil.parseRatio(width);
-        if (height != null) this.height = (float)XMLParseUtil.parseRatio(height);
-
-
-        if (href != null)
-        {
-            try {
-                URI src = getXMLBase().resolve(href);
-                this.href = helper.universe.getElement(src);
-            }
-            catch (Exception e)
-            {
-                e.printStackTrace();
-            }
+    /**
+     * Creates a new instance of LinearGradient
+     */
+    public Use()
+    {
+    }
+
+    public String getTagName()
+    {
+        return TAG_NAME;
+    }
+
+    protected void build() throws SVGException
+    {
+        super.build();
+
+        StyleAttribute sty = new StyleAttribute();
+
+        if (getPres(sty.setName("x")))
+        {
+            x = sty.getFloatValueWithUnits();
+        }
+
+        if (getPres(sty.setName("y")))
+        {
+            y = sty.getFloatValueWithUnits();
+        }
+
+        if (getPres(sty.setName("width")))
+        {
+            width = sty.getFloatValueWithUnits();
+        }
+
+        if (getPres(sty.setName("height")))
+        {
+            height = sty.getFloatValueWithUnits();
+        }
+
+        if (getPres(sty.setName("xlink:href")))
+        {
+            URI src = sty.getURIValue(getXMLBase());
+            href = src;
+//            href = diagram.getUniverse().getElement(src);
         }
 
@@ -86,32 +107,6 @@
         refXform = new AffineTransform();
         refXform.translate(this.x, this.y);
-        refXform.scale(this.width, this.height);
-    }
-*/
-    protected void build() throws SVGException
-    {
-        super.build();
-        
-        StyleAttribute sty = new StyleAttribute();
-        
-        if (getPres(sty.setName("x"))) x = sty.getFloatValueWithUnits();
-
-        if (getPres(sty.setName("y"))) y = sty.getFloatValueWithUnits();
-
-        if (getPres(sty.setName("width"))) width = sty.getFloatValueWithUnits();
-
-        if (getPres(sty.setName("height"))) height = sty.getFloatValueWithUnits();
-
-        if (getPres(sty.setName("xlink:href")))
-        {
-            URI src = sty.getURIValue(getXMLBase());
-            href = diagram.getUniverse().getElement(src);
-        }
-        
-        //Determine use offset/scale
-        refXform = new AffineTransform();
-        refXform.translate(this.x, this.y);
-    }
-    
+    }
+
     public void render(Graphics2D g) throws SVGException
     {
@@ -122,7 +117,12 @@
         g.transform(refXform);
 
-        if (href == null || !(href instanceof RenderableElement)) return;
-
-        RenderableElement rendEle = (RenderableElement)href;
+        SVGElement ref = diagram.getUniverse().getElement(href);
+
+        if (ref == null || !(ref instanceof RenderableElement))
+        {
+            return;
+        }
+
+        RenderableElement rendEle = (RenderableElement) ref;
         rendEle.pushParentContext(this);
         rendEle.render(g);
@@ -136,7 +136,8 @@
     public Shape getShape()
     {
-        if (href instanceof ShapeElement)
-        {
-            Shape shape = ((ShapeElement)href).getShape();
+        SVGElement ref = diagram.getUniverse().getElement(href);
+        if (ref instanceof ShapeElement)
+        {
+            Shape shape = ((ShapeElement) ref).getShape();
             shape = refXform.createTransformedShape(shape);
             shape = shapeToParent(shape);
@@ -149,11 +150,12 @@
     public Rectangle2D getBoundingBox() throws SVGException
     {
-        if (href instanceof ShapeElement)
-        {
-            ShapeElement shapeEle = (ShapeElement)href;
+        SVGElement ref = diagram.getUniverse().getElement(href);
+        if (ref instanceof ShapeElement)
+        {
+            ShapeElement shapeEle = (ShapeElement) ref;
             shapeEle.pushParentContext(this);
             Rectangle2D bounds = shapeEle.getBoundingBox();
             shapeEle.popParentContext();
-            
+
             bounds = refXform.createTransformedShape(bounds).getBounds2D();
             bounds = boundsToParent(bounds);
@@ -166,6 +168,7 @@
 
     /**
-     * Updates all attributes in this diagram associated with a time event.
-     * Ie, all attributes with track information.
+     * Updates all attributes in this diagram associated with a time event. Ie,
+     * all attributes with track information.
+     *
      * @return - true if this node has changed state as a result of the time
      * update
@@ -179,67 +182,67 @@
         StyleAttribute sty = new StyleAttribute();
         boolean shapeChange = false;
+
+        if (getPres(sty.setName("x")))
+        {
+            float newVal = sty.getFloatValueWithUnits();
+            if (newVal != x)
+            {
+                x = newVal;
+                shapeChange = true;
+            }
+        }
+
+        if (getPres(sty.setName("y")))
+        {
+            float newVal = sty.getFloatValueWithUnits();
+            if (newVal != y)
+            {
+                y = newVal;
+                shapeChange = true;
+            }
+        }
+
+        if (getPres(sty.setName("width")))
+        {
+            float newVal = sty.getFloatValueWithUnits();
+            if (newVal != width)
+            {
+                width = newVal;
+                shapeChange = true;
+            }
+        }
+
+        if (getPres(sty.setName("height")))
+        {
+            float newVal = sty.getFloatValueWithUnits();
+            if (newVal != height)
+            {
+                height = newVal;
+                shapeChange = true;
+            }
+        }
+
+        if (getPres(sty.setName("xlink:href")))
+        {
+            URI src = sty.getURIValue(getXMLBase());
+//            SVGElement newVal = diagram.getUniverse().getElement(src);
+            if (!src.equals(href))
+            {
+                href = src;
+                shapeChange = true;
+            }
+        }
+        /*
+         if (getPres(sty.setName("xlink:href")))
+         {
+         URI src = sty.getURIValue(getXMLBase());
+         href = diagram.getUniverse().getElement(src);
+         }
         
-        if (getPres(sty.setName("x")))
-        {
-            float newVal = sty.getFloatValueWithUnits();
-            if (newVal != x)
-            {
-                x = newVal;
-                shapeChange = true;
-            }
-        }
-
-        if (getPres(sty.setName("y")))
-        {
-            float newVal = sty.getFloatValueWithUnits();
-            if (newVal != y)
-            {
-                y = newVal;
-                shapeChange = true;
-            }
-        }
-
-        if (getPres(sty.setName("width")))
-        {
-            float newVal = sty.getFloatValueWithUnits();
-            if (newVal != width)
-            {
-                width = newVal;
-                shapeChange = true;
-            }
-        }
-
-        if (getPres(sty.setName("height")))
-        {
-            float newVal = sty.getFloatValueWithUnits();
-            if (newVal != height)
-            {
-                height = newVal;
-                shapeChange = true;
-            }
-        }
-        
-        if (getPres(sty.setName("xlink:href")))
-        {
-            URI src = sty.getURIValue(getXMLBase());
-            SVGElement newVal = diagram.getUniverse().getElement(src);
-            if (newVal != href)
-            {
-                href = newVal;
-                shapeChange = true;
-            }
-        }
-/*
-        if (getPres(sty.setName("xlink:href")))
-        {
-            URI src = sty.getURIValue(getXMLBase());
-            href = diagram.getUniverse().getElement(src);
-        }
-        
-        //Determine use offset/scale
-        refXform = new AffineTransform();
-        refXform.translate(this.x, this.y);
-        refXform.scale(this.width, this.height);
-*/        
+         //Determine use offset/scale
+         refXform = new AffineTransform();
+         refXform.translate(this.x, this.y);
+         refXform.scale(this.width, this.height);
+         */
         if (shapeChange)
         {
@@ -250,5 +253,5 @@
 //            return true;
         }
-        
+
         return changeState || shapeChange;
     }
