/* * 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.client.controlpoints; import com.ait.lienzo.client.core.event.NodeDragEndEvent; import com.ait.lienzo.client.core.event.NodeDragEndHandler; import com.ait.lienzo.client.core.event.NodeDragMoveEvent; import com.ait.lienzo.client.core.event.NodeDragMoveHandler; import org.uberfire.ext.wires.core.api.controlpoints.ControlPointMoveHandler; import org.uberfire.ext.wires.core.api.controlpoints.HasControlPoints; import org.uberfire.ext.wires.core.api.magnets.Magnet; import org.uberfire.ext.wires.core.api.magnets.MagnetManager; /** * A Control Point that can be connected to Magnets */ public class ConnectibleControlPoint extends DefaultControlPoint { private static final int MAGNET_ATTRACTION = 30; private final HasControlPoints shape; private final MagnetManager magnetManager; private Magnet boundMagnet; public ConnectibleControlPoint(final double x, final double y, final HasControlPoints shape, final MagnetManager magnetManager, final ControlPointMoveHandler cpMoveHandler) { super(x, y, cpMoveHandler); this.shape = shape; this.magnetManager = magnetManager; } @Override protected void setupHandlers(final ControlPointMoveHandler handler) { addNodeDragMoveHandler(new NodeDragMoveHandler() { @Override public void onNodeDragMove(final NodeDragMoveEvent nodeDragMoveEvent) { handler.onMove(ConnectibleControlPoint.this.getX(), ConnectibleControlPoint.this.getY()); if (boundMagnet != null) { boundMagnet.detachControlPoint(ConnectibleControlPoint.this); } boundMagnet = magnetManager.getMagnet(shape, ConnectibleControlPoint.this.getX(), ConnectibleControlPoint.this.getY()); getLayer().batch(); } }); addNodeDragEndHandler(new NodeDragEndHandler() { @Override public void onNodeDragEnd(final NodeDragEndEvent nodeDragEndEvent) { if (boundMagnet != null) { double deltaX = getX() - boundMagnet.getX(); double deltaY = getY() - boundMagnet.getY(); double distance = Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); if (distance < MAGNET_ATTRACTION) { boundMagnet.attachControlPoint(ConnectibleControlPoint.this); final double x = boundMagnet.getX(); final double y = boundMagnet.getY(); setX(x); setY(y); handler.onMove(x, y); } } magnetManager.hideAllMagnets(); getLayer().batch(); } }); } public Magnet getBoundMagnet() { return boundMagnet; } @Override public String toString() { return "ConnectibleControlPoint{" + "id=" + getId() + "}"; } }