/* * Copyright 2015 JBoss, by Red Hat, Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.uberfire.ext.wires.core.scratchpad.client.shapes.connectors; import com.ait.lienzo.client.core.event.NodeDragMoveEvent; import com.ait.lienzo.client.core.event.NodeDragMoveHandler; import com.ait.lienzo.client.core.shape.BezierCurve; import com.ait.lienzo.client.core.shape.Line; import org.uberfire.ext.wires.core.api.controlpoints.ControlPoint; import org.uberfire.ext.wires.core.api.controlpoints.ControlPointMoveHandler; import org.uberfire.ext.wires.core.api.magnets.Magnet; import org.uberfire.ext.wires.core.api.magnets.MagnetManager; import org.uberfire.ext.wires.core.api.magnets.RequiresMagnetManager; import org.uberfire.ext.wires.core.api.shapes.WiresBaseDynamicShape; import org.uberfire.ext.wires.core.api.shapes.WiresShape; import org.uberfire.ext.wires.core.client.controlpoints.ConnectibleControlPoint; import org.uberfire.ext.wires.core.client.controlpoints.DefaultControlPoint; public class WiresBezierCurve extends WiresBaseDynamicShape implements MagnetManager, RequiresMagnetManager { private static final int BOUNDARY_SIZE = 10; //We do not hide the boundary item for Lines as it makes selecting them very difficult private static final double ALPHA_DESELECTED = 0.01; private static final double ALPHA_SELECTED = 0.1; private final BezierCurve curve; private final BezierCurve bounding; private final Line controlLine1; private final Line controlLine2; private final ConnectibleControlPoint controlPoint1; private final ControlPoint controlPoint2; private final ControlPoint controlPoint3; private final ConnectibleControlPoint controlPoint4; private MagnetManager magnetManager; public WiresBezierCurve(final BezierCurve shape) { final double x = shape.getControlPoints().get(0).getX(); final double y = shape.getControlPoints().get(0).getY(); final double controlX1 = shape.getControlPoints().get(1).getX(); final double controlY1 = shape.getControlPoints().get(1).getY(); final double controlX2 = shape.getControlPoints().get(2).getX(); final double controlY2 = shape.getControlPoints().get(2).getY(); final double endX = shape.getControlPoints().get(3).getX(); final double endY = shape.getControlPoints().get(3).getY(); curve = shape; bounding = new BezierCurve(x, y, controlX1, controlY1, controlX2, controlY2, endX, endY); bounding.setStrokeWidth(BOUNDARY_SIZE); bounding.setAlpha(ALPHA_DESELECTED); controlLine1 = new Line(x, y, controlX1, controlY1); controlLine1.setAlpha(0.5); controlLine1.setStrokeColor("#0000ff"); controlLine1.setDashArray(2, 2); controlLine2 = new Line(controlX2, controlY2, endX, endY); controlLine2.setAlpha(0.5); controlLine2.setStrokeColor("#0000ff"); controlLine2.setDashArray(2, 2); add(curve); add(bounding); magnets.clear(); controlPoints.clear(); controlPoint1 = new ConnectibleControlPoint(curve.getControlPoints().get(0).getX(), curve.getControlPoints().get(0).getY(), this, this, new ControlPointMoveHandler() { @Override public void onMove(final double x, final double y) { curve.getControlPoints().get(0).setX(x - getX()); curve.getControlPoints().get(0).setY(y - getY()); bounding.getControlPoints().get(0).setX(x - getX()); bounding.getControlPoints().get(0).setY(y - getY()); controlLine1.getPoints().get(0).setX(x - getX()); controlLine1.getPoints().get(0).setY(y - getY()); } } ); controlPoint2 = new DefaultControlPoint(curve.getControlPoints().get(1).getX(), curve.getControlPoints().get(1).getY(), new ControlPointMoveHandler() { @Override public void onMove(final double x, final double y) { curve.getControlPoints().get(1).setX(x - getX()); curve.getControlPoints().get(1).setY(y - getY()); bounding.getControlPoints().get(1).setX(x - getX()); bounding.getControlPoints().get(1).setY(y - getY()); controlLine1.getPoints().get(1).setX(x - getX()); controlLine1.getPoints().get(1).setY(y - getY()); } } ); controlPoint3 = new DefaultControlPoint(curve.getControlPoints().get(2).getX(), curve.getControlPoints().get(2).getY(), new ControlPointMoveHandler() { @Override public void onMove(final double x, final double y) { curve.getControlPoints().get(2).setX(x - getX()); curve.getControlPoints().get(2).setY(y - getY()); bounding.getControlPoints().get(2).setX(x - getX()); bounding.getControlPoints().get(2).setY(y - getY()); controlLine2.getPoints().get(0).setX(x - getX()); controlLine2.getPoints().get(0).setY(y - getY()); } } ); controlPoint4 = new ConnectibleControlPoint(curve.getControlPoints().get(3).getX(), curve.getControlPoints().get(3).getY(), this, this, new ControlPointMoveHandler() { @Override public void onMove(final double x, final double y) { curve.getControlPoints().get(3).setX(x - getX()); curve.getControlPoints().get(3).setY(y - getY()); bounding.getControlPoints().get(3).setX(x - getX()); bounding.getControlPoints().get(3).setY(y - getY()); controlLine2.getPoints().get(1).setX(x - getX()); controlLine2.getPoints().get(1).setY(y - getY()); } } ); addControlPoint(controlPoint1); addControlPoint(controlPoint2); addControlPoint(controlPoint3); addControlPoint(controlPoint4); //If Connector is dragged as a whole (i.e. not a ControlPoint) detach it from Magnets addNodeDragMoveHandler(new NodeDragMoveHandler() { @Override public void onNodeDragMove(final NodeDragMoveEvent nodeDragMoveEvent) { final Magnet boundMagnet1 = controlPoint1.getBoundMagnet(); final Magnet boundMagnet4 = controlPoint4.getBoundMagnet(); if (boundMagnet1 != null) { boundMagnet1.detachControlPoint(controlPoint1); } if (boundMagnet4 != null) { boundMagnet4.detachControlPoint(controlPoint4); } getLayer().batch(); } }); } @Override public void setMagnetManager(final MagnetManager magnetManager) { this.magnetManager = magnetManager; } @Override public void hideAllMagnets() { if (magnetManager != null) { magnetManager.hideAllMagnets(); } } @Override public Magnet getMagnet(final WiresShape shapeActive, final double cx, final double cy) { if (this.magnetManager != null) { return magnetManager.getMagnet(shapeActive, cx, cy); } return null; } @Override public void setSelected(final boolean isSelected) { if (isSelected) { add(controlLine1); add(controlLine2); bounding.setAlpha(ALPHA_SELECTED); } else { remove(controlLine1); remove(controlLine2); bounding.setAlpha(ALPHA_DESELECTED); } } @Override public boolean contains(final double cx, final double cy) { return false; } }