package org.xmind.ui.internal.svgsupport;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.swt.widgets.Display;
import org.w3c.dom.Element;
import org.xmind.gef.draw2d.geometry.PrecisionPoint;
import org.xmind.gef.draw2d.geometry.PrecisionRectangle;
import org.xmind.gef.draw2d.graphics.Path;
/**
*
* @author Enki Xiong
*
*/
final public class SVGPolyLineShape extends SVGShape {
public static Pattern pattern = Pattern.compile("[+-]?\\d+(\\.\\d+)?"); //$NON-NLS-1$
private List<PrecisionPoint> points;
SVGPolyLineShape() {
super();
}
public SVGPolyLineShape(List<PrecisionPoint> points) {
this.points = points;
}
@Override
public void parse(Element implemention, SVGShape parent) {
super.parse(implemention, parent);
parsePolyLine(implemention, parent);
}
private void parsePolyLine(Element implemention, SVGShape parent) {
String pointString = implemention
.getAttribute(SVGDefinitionConstants.POINTS);
final Matcher match = pattern.matcher(pointString);
LinkedList<String> strs = new LinkedList<String>();
while (match.find())
strs.add(match.group());
if (strs.size() % 2 == 1)
return;
while (!strs.isEmpty()) {
float x = Float.valueOf(strs.removeFirst());
float y = Float.valueOf(strs.removeFirst());
points.add(new PrecisionPoint(x, y));
}
}
@Override
Path generatePath(Display device) {
Path path = new Path(device);
if (!points.isEmpty()) {
path.moveTo(points.get(0));
for (int i = 1; i < points.size(); i++) {
path.lineTo(points.get(i));
}
}
return path;
}
@Override
PrecisionRectangle generateRectangle() {
return INVALID_RECT;
}
@Override
protected SVGShape clone() {
SVGPolyLineShape polyline = new SVGPolyLineShape();
polyline.setInfo(getInfo().clone());
polyline.points = this.points;
return polyline;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj instanceof SVGPolyLineShape) {
SVGPolyLineShape polyline = (SVGPolyLineShape) obj;
if (points.size() == polyline.points.size()) {
for (int i = 0; i < points.size(); i++) {
if (!points.get(i).equals(polyline.points.get(i)))
return false;
}
return true;
}
}
return false;
}
@Override
public int hashCode() {
int result = 17;
result = result * 31 + getInfo().hashCode();
for (PrecisionPoint p : points) {
result = result * 31 + (int) Double.doubleToLongBits(p.x);
result = result * 31 + (int) Double.doubleToLongBits(p.y);
}
return result;
}
@Override
public String toString() {
String str = "SVGPolyline(" + getInfo().toString() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
return str;
}
}