package org.xmind.ui.internal.svgsupport;
import java.util.Collections;
import java.util.List;
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 public class SVGPath extends SVGShape {
private List<PathElement> elements;
SVGPath() {
super();
elements = Collections.emptyList();
}
public SVGPath(List<PathElement> elements) {
this.elements = elements;
}
@Override
void parse(Element implemention, SVGShape parent) {
super.parse(implemention, parent);
parsePath(implemention, parent);
}
private void parsePath(Element implemention, SVGShape parent) {
if (implemention.hasAttribute(SVGDefinitionConstants.DEFINITION)) {
String pathDefinitionString = implemention
.getAttribute(SVGDefinitionConstants.DEFINITION);
PathParser parser = PathParser.getInstance();
elements = parser.parseSVGPath(pathDefinitionString);
}
}
@Override
Path generatePath(Display device) {
Path path = new Path(device);
for (PathElement ele : elements) {
ele.addToPath(path);
}
return path;
}
@Override
PrecisionRectangle generateRectangle() {
return INVALID_RECT;
}
@Override
protected SVGShape clone() {
SVGPath path = new SVGPath();
path.elements = this.elements;
path.setInfo(getInfo().clone());
return path;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj instanceof SVGPath) {
SVGPath path = (SVGPath) obj;
if (elements.size() == path.elements.size()) {
for (int i = 0; i < elements.size(); i++) {
if (!elements.get(i).equals(path.elements.get(i)))
return false;
}
return true;
}
}
return false;
}
@Override
public int hashCode() {
int result = 17;
result = result * 31 + getInfo().hashCode();
for (PathElement element : elements)
result = result * 31 + element.hashCode();
return result;
}
@Override
public String toString() {
return "SVGPath( elements:" + elements.size() + " " //$NON-NLS-1$//$NON-NLS-2$
+ getInfo().toString() + " )"; //$NON-NLS-1$
}
}