package org.xmind.ui.internal.svgsupport; import org.eclipse.draw2d.Graphics; import org.eclipse.jface.resource.ResourceManager; import org.eclipse.swt.widgets.Display; import org.w3c.dom.Element; import org.xmind.gef.draw2d.geometry.PrecisionRectangle; import org.xmind.gef.draw2d.graphics.Path; /** * * @author Enki Xiong * */ final class SVGUseElement extends SVGShape { private float x; private float y; private SVGShape link; SVGUseElement() { super(); } public SVGUseElement(SVGShape link) { this.link = link; } @Override void parse(Element implemention, SVGShape parent) { super.parse(implemention, parent); parseUse(implemention, parent); } private void parseUse(Element implemention, SVGShape parent) { if (implemention.hasAttribute(SVGDefinitionConstants.XLINK_HREF)) { String hrefId = implemention .getAttribute(SVGDefinitionConstants.XLINK_HREF); String[] strs = hrefId.split(SVGDefinitionConstants.REF_BEGIN); if (strs.length >= 2) { link = ((SVGShape) idRefs.get(strs[1])).clone(); } if (link != null) link.getInfo().add(getInfo()); } x = getFloatAttribute(implemention, SVGDefinitionConstants.X); y = getFloatAttribute(implemention, SVGDefinitionConstants.Y); } @Override void paintImage(Graphics graphics, Display device) { if (link != null) { boolean statePushed = super.prePaint(graphics); graphics.translate(x, y); link.paintImage(graphics, device); super.postPaint(graphics, statePushed); } } @Override public void setResourceManager(ResourceManager resourceManager) { super.setResourceManager(resourceManager); this.link.setResourceManager(resourceManager); } @Override Path generatePath(Display device) { // not implement return null; } @Override PrecisionRectangle generateRectangle() { // not implement return null; } @Override protected SVGShape clone() { // not implement return null; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj instanceof SVGUseElement) { SVGUseElement use = (SVGUseElement) obj; if (getInfo().equals(use.getInfo()) && x == use.x && y == use.y && link.equals(use.link)) return true; } return false; } @Override public int hashCode() { int result = 17; result = result * 31 + getInfo().hashCode(); result = result * 31 + Float.floatToIntBits(x); result = result * 31 + Float.floatToIntBits(y); result = result * 31 + link.hashCode(); return result; } @Override public String toString() { return "SVGUse(" + getInfo().toString() + link.toString() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } }