package com.kreative.paint.document.draw; import java.awt.Shape; import java.awt.geom.GeneralPath; import java.awt.geom.Line2D; import java.awt.geom.Point2D; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; public class PathDrawObject extends ShapeDrawObject { private Path path; public PathDrawObject(PaintSettings ps) { super(ps); this.path = new Path(); } public PathDrawObject(PaintSettings ps, Path path) { super(ps); this.path = path.clone(); } public PathDrawObject(PaintSettings ps, Shape s) { super(ps); this.path = new Path(); this.path.appendAWTShape(s); } private PathDrawObject(PathDrawObject o) { super(o); this.path = o.path.clone(); } @Override public PathDrawObject clone() { return new PathDrawObject(this); } public Path getPath() { return path.clone(); } @Override public GeneralPath getShape() { return path.toAWTShape(); } @Override protected Object getControlState() { return path.clone(); } @Override protected void setControlState(Object o) { this.path = ((Path)o).clone(); } @Override public int getControlPointCount() { int count = 0; for (PathContour c : path) { count += c.size() * 3; } return count; } @Override protected ControlPoint getControlPointImpl(int i) { for (PathContour c : path) { int n3 = c.size() * 3; if (i < n3) { PathPoint p = c.get(i / 3); Point2D p2; switch (i % 3) { case 0: p2 = p.getPreviousCtrl(); return new ControlPoint( p.isPreviousLinear() ? ControlPointType.HIDDEN : ControlPointType.CONTROL_POINT, p2.getX(), p2.getY() ); case 1: return new ControlPoint( p.isAngleLocked() ? ControlPointType.CURVED_MIDPOINT : ControlPointType.STRAIGHT_MIDPOINT, p.getX(), p.getY() ); case 2: p2 = p.getNextCtrl(); return new ControlPoint( p.isNextLinear() ? ControlPointType.HIDDEN : ControlPointType.CONTROL_POINT, p2.getX(), p2.getY() ); } } else { i -= n3; } } return null; } @Override protected List<ControlPoint> getControlPointsImpl() { List<ControlPoint> cpts = new ArrayList<ControlPoint>(); for (PathContour c : path) { for (PathPoint p : c) { Point2D p2; p2 = p.getPreviousCtrl(); cpts.add(new ControlPoint( p.isPreviousLinear() ? ControlPointType.HIDDEN : ControlPointType.CONTROL_POINT, p2.getX(), p2.getY() )); cpts.add(new ControlPoint( ControlPointType.STRAIGHT_MIDPOINT, p.getX(), p.getY() )); p2 = p.getNextCtrl(); cpts.add(new ControlPoint( p.isNextLinear() ? ControlPointType.HIDDEN : ControlPointType.CONTROL_POINT, p2.getX(), p2.getY() )); } } return cpts; } @Override protected Collection<Line2D> getControlLinesImpl() { Collection<Line2D> lines = new HashSet<Line2D>(); for (PathContour c : path) { for (PathPoint p : c) { if (!p.isPreviousLinear()) { lines.add(new Line2D.Double(p.getLocation(), p.getPreviousCtrl())); } if (!p.isNextLinear()) { lines.add(new Line2D.Double(p.getLocation(), p.getNextCtrl())); } } } return lines; } @Override protected int setControlPointImpl(int i, double x, double y) { int ret = i; for (PathContour c : path) { int n3 = c.size() * 3; if (i < n3) { PathPoint p = c.get(i / 3); switch (i % 3) { case 0: p.setPreviousCtrl(x, y); break; case 1: p.setLocation(x, y); break; case 2: p.setNextCtrl(x, y); break; } return ret; } else { i -= n3; } } return ret; } @Override protected Point2D getLocationImpl() { for (PathContour c : path) { for (PathPoint p : c) { return p.getLocation(); } } return new Point2D.Double(0, 0); } @Override protected void setLocationImpl(double x, double y) { Point2D p0 = getLocationImpl(); double x0 = p0.getX(); double y0 = p0.getY(); for (PathContour c : path) { for (PathPoint p : c) { double px = p.getX(); double py = p.getY(); p.setLocation(x + (px - x0), y + (py - y0)); } } } }