private boolean add(final BezierPath bezierPath, boolean isClosed) { bezierPath.setClosed(isClosed); BezierFigure figure = new BezierFigure(isClosed); figure.setBezierPath(bezierPath); return figures.add(figure); }
@SuppressWarnings("unchecked") protected BezierFigure createFigure() { BezierFigure f = (BezierFigure) prototype.clone(); getEditor().applyDefaultAttributesTo(f); if (attributes != null) { for (Map.Entry<AttributeKey, Object> entry : attributes.entrySet()) { f.set(entry.getKey(), entry.getValue()); } } return f; }
@Override protected void drawStroke(Graphics2D g) { for (final BezierFigure figure : figures) { g.draw(figure.getBezierPath()); } }
/** * Adds a control point. */ public void addNode(BezierPath.Node p) { addNode(getNodeCount(), p); }
public void setClosed(boolean newValue) { set(PATH_CLOSED, newValue); setConnectable(newValue); }
/** * Convenience method for setting the point coordinate of the end point. * If the BezierFigure has not at least two nodes, nodes are added * to the figure until the BezierFigure has at least two nodes. */ public void setEndPoint(Point2D.Double p) { // Add two nodes if we haven't at least two nodes for (int i = getNodeCount(); i < 2; i++) { addNode(0, new BezierPath.Node(p.x, p.y)); } setPoint(getNodeCount() - 1, p); }
@Override public Collection<Handle> createSecondaryHandles() { BezierFigure f = getOwner(); LinkedList<Handle> list = new LinkedList<Handle>(); BezierPath.Node v = f.getNode(index); if ((v.mask & BezierPath.C1_MASK) != 0 && (index != 0 || f.isClosed())) { list.add(new BezierControlPointHandle(f, index, 1, getTransformOwner())); } if ((v.mask & BezierPath.C2_MASK) != 0 && (index < f.getNodeCount() - 1 || f.isClosed())) { list.add(new BezierControlPointHandle(f, index, 2, getTransformOwner())); } if (index > 0 || f.isClosed()) { int i = (index == 0) ? f.getNodeCount() - 1 : index - 1; v = f.getNode(i); if ((v.mask & BezierPath.C2_MASK) != 0) { list.add(new BezierControlPointHandle(f, i, 2, getTransformOwner())); } } if (index < f.getNodeCount() - 1 || f.isClosed()) { int i = (index == f.getNodeCount() - 1) ? 0 : index + 1; v = f.getNode(i); if ((v.mask & BezierPath.C1_MASK) != 0) { list.add(new BezierControlPointHandle(f, i, 1, getTransformOwner())); } } return list; }
@Override public void keyPressed(KeyEvent evt) { final BezierFigure f = getOwner(); BezierPath.Node oldNode = f.getNode(index); f.willChange(); f.setPoint(index, controlPointIndex, new Point2D.Double(oldNode.x[controlPointIndex], oldNode.y[controlPointIndex] - 1d)); f.changed(); view.getDrawing().fireUndoableEditHappened(new BezierNodeEdit(f, index, oldNode, f.getNode(index))); evt.consume(); break; case KeyEvent.VK_DOWN: f.willChange(); f.setPoint(index, controlPointIndex, new Point2D.Double(oldNode.x[controlPointIndex], oldNode.y[controlPointIndex] + 1d)); f.changed(); view.getDrawing().fireUndoableEditHappened(new BezierNodeEdit(f, index, oldNode, f.getNode(index))); evt.consume(); break; case KeyEvent.VK_LEFT: f.willChange(); f.setPoint(index, controlPointIndex, new Point2D.Double(oldNode.x[controlPointIndex] - 1d, oldNode.y[controlPointIndex])); f.changed(); view.getDrawing().fireUndoableEditHappened(new BezierNodeEdit(f, index, oldNode, f.getNode(index))); evt.consume(); break; case KeyEvent.VK_RIGHT: f.willChange(); f.setPoint(index, controlPointIndex, new Point2D.Double(oldNode.x[controlPointIndex] + 1d, oldNode.y[controlPointIndex])); f.changed(); view.getDrawing().fireUndoableEditHappened(new BezierNodeEdit(f, index, oldNode, f.getNode(index)));
@Override public void updateFigure(final OverlayView view, final BezierFigure figure) { super.updateFigure(view, figure); assert view.getData() instanceof GeneralPathOverlay; final GeneralPathOverlay gpo = (GeneralPathOverlay) view.getData(); final GeneralPathRegionOfInterest gpr = gpo.getRegionOfInterest(); final PathIterator pi = gpr.getGeneralPath().getPathIterator(null); final int nCount = figure.getNodeCount(); int i = 0; final double[] pos = new double[6]; while (!pi.isDone()) { pi.currentSegment(pos); final Node n = new Node(pos[0], pos[1]); if (i < nCount) figure.getNode(i).setTo(n); else figure.addNode(n); pi.next(); i++; } while (i < figure.getNodeCount()) figure.removeNode(i); }
if (createdFigure.getNodeCount() > nodeCountBeforeDrag + 1) { createdFigure.willChange(); BezierPath figurePath = createdFigure.getBezierPath(); BezierPath digitizedPath = new BezierPath(); for (int i = nodeCountBeforeDrag - 1, n = figurePath.size(); i < n; i++) { createdFigure.setBezierPath(figurePath); createdFigure.changed(); nodeCountBeforeDrag = createdFigure.getNodeCount(); if (createdFigure.getNodeCount() > 1) { Rectangle r = new Rectangle(anchor.x, anchor.y, 0, 0); r.add(evt.getX(), evt.getY());
protected void addPointToFigure(Point2D.Double newPoint) { int pointCount = createdFigure.getNodeCount(); createdFigure.willChange(); if (pointCount < 2) { createdFigure.addNode(new BezierPath.Node(newPoint)); } else { Point2D.Double endPoint = createdFigure.getEndPoint(); Point2D.Double secondLastPoint = (pointCount <= 1) ? endPoint : createdFigure.getPoint(pointCount - 2, 0); if (newPoint.equals(endPoint)) { // nothing to do } else if (pointCount > 1 && Geom.lineContainsPoint(newPoint.x, newPoint.y, secondLastPoint.x, secondLastPoint.y, endPoint.x, endPoint.y, 0.9f / getView().getScaleFactor())) { createdFigure.setPoint(pointCount - 1, 0, newPoint); } else { createdFigure.addNode(new BezierPath.Node(newPoint)); } } createdFigure.changed(); }
final BezierFigure f = getOwner(); BezierPath.Node oldValue = (BezierPath.Node) oldNode.clone();; BezierPath.Node newValue = f.getNode(index); f.willChange(); if (index > 0 && index < f.getNodeCount() || f.isClosed()) { newValue.mask = (newValue.mask + 3) % 4; } else if (index == 0) { newValue.mask = ((newValue.mask & BezierPath.C1_MASK) == 0) ? BezierPath.C1_MASK : 0; f.setNode(index, newValue); f.changed(); fireHandleRequestSecondaryHandles();
@Nullable protected BezierPath.Node getBezierNode() { return getBezierFigure().getNodeCount() > index ? getBezierFigure().getNode(index) : null; }
final BezierFigure figure = getBezierFigure(); BezierPath.Node oldValue = (BezierPath.Node) oldNode.clone(); BezierPath.Node newValue = figure.getNode(index); if ((modifiersEx & (InputEvent.META_DOWN_MASK | InputEvent.CTRL_DOWN_MASK | InputEvent.ALT_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK)) != 0) { figure.willChange(); newValue.keepColinear = !newValue.keepColinear; if (newValue.keepColinear) { Point2D.Double p = figure.getPoint(index, controlPointIndex); double a = Math.PI + Math.atan2(p.y - newValue.y[0], p.x - newValue.x[0]); int c2 = (controlPointIndex == 1) ? 2 : 1; newValue.y[c2] = p2.y; figure.setNode(index, newValue); figure.changed();
public boolean handleMouseClick(Point2D.Double p, MouseEvent evt, DrawingView view) { if (evt.getClickCount() == 2 && view.getHandleDetailLevel() % 2 == 0) { willChange(); final int index = splitSegment(p, 5f / view.getScaleFactor()); if (index != -1) { final BezierPath.Node newNode = getNode(index); fireUndoableEditHappened(new AbstractUndoableEdit() { changed(); evt.consume(); return true;
@Override public void redo() throws CannotRedoException { super.redo(); willChange(); addNode(index, newNode); changed(); }
/** * Sets an attribute of the figure. * AttributeKey name and semantics are defined by the class implementing * the figure interface. */ @Override public <T> void set(AttributeKey<T> key, T newValue) { super.set(key, newValue); for (final BezierFigure figure : figures) { figure.set(key, newValue); } }
@Override public boolean add(final BezierFigure figure) { figure.restoreAttributesTo(SwingGeneralPathFigure.this.getAttributesRestoreData()); figure.addFigureListener(new FigureListener() { @Override public void areaInvalidated(FigureEvent e) {
@Override public Collection<Handle> createHandles(final int detailLevel) { final LinkedList<Handle> handles = new LinkedList<>(); for (final BezierFigure figure : figures) { handles.addAll(figure.createHandles(detailLevel)); } return handles; }
@Override public Object getTransformRestoreData() { final List<BezierFigure> result = new ArrayList<>(); for (final BezierFigure figure : figures) { result.add(figure.clone()); } return result; }