/*
* Copyright 2017 Red Hat, Inc. and/or its affiliates.
*
* 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.kie.workbench.common.stunner.client.lienzo.canvas.controls.docking;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import com.ait.lienzo.client.core.shape.wires.IDockingAcceptor;
import com.ait.lienzo.client.core.shape.wires.WiresContainer;
import com.ait.lienzo.client.core.shape.wires.WiresShape;
import org.kie.workbench.common.stunner.client.lienzo.canvas.controls.AbstractContainmentBasedControl;
import org.kie.workbench.common.stunner.client.lienzo.canvas.wires.WiresCanvas;
import org.kie.workbench.common.stunner.client.lienzo.canvas.wires.WiresUtils;
import org.kie.workbench.common.stunner.core.client.canvas.AbstractCanvasHandler;
import org.kie.workbench.common.stunner.core.client.canvas.controls.docking.DockingAcceptorControl;
import org.kie.workbench.common.stunner.core.client.command.CanvasCommandFactory;
import org.kie.workbench.common.stunner.core.client.command.CanvasViolation;
import org.kie.workbench.common.stunner.core.command.Command;
import org.kie.workbench.common.stunner.core.graph.Edge;
import org.kie.workbench.common.stunner.core.graph.Node;
import org.kie.workbench.common.stunner.core.graph.content.relationship.Dock;
@Dependent
public class DockingAcceptorControlImpl extends AbstractContainmentBasedControl
implements DockingAcceptorControl<AbstractCanvasHandler> {
private static final int HOTSPOT = 10;
private CanvasCommandFactory<AbstractCanvasHandler> canvasCommandFactory;
@Inject
public DockingAcceptorControlImpl(final CanvasCommandFactory<AbstractCanvasHandler> canvasCommandFactory) {
this.canvasCommandFactory = canvasCommandFactory;
}
@Override
protected void doEnable(final WiresCanvas.View view) {
view.setDockingAcceptor(DOCKING_ACCEPTOR);
}
@Override
protected void doDisable(final WiresCanvas.View view) {
view.setDockingAcceptor(IDockingAcceptor.NONE);
}
@Override
protected boolean isEdgeAccepted(final Edge edge) {
return edge.getContent() instanceof Dock;
}
@Override
protected Command<AbstractCanvasHandler, CanvasViolation> getAddEdgeCommand(final Node parent,
final Node child) {
return canvasCommandFactory.dockNode(parent,
child);
}
@Override
protected Command<AbstractCanvasHandler, CanvasViolation> getDeleteEdgeCommand(final Node parent,
final Node child) {
return canvasCommandFactory.unDockNode(parent,
child);
}
private final IDockingAcceptor DOCKING_ACCEPTOR = new IDockingAcceptor() {
@Override
public boolean dockingAllowed(final WiresContainer wiresContainer,
final WiresShape wiresShape) {
if (!isAccept(wiresContainer,
wiresShape)) {
return false;
}
final Node childNode = WiresUtils.getNode(getCanvasHandler(),
wiresShape);
final Node parentNode = WiresUtils.getNode(getCanvasHandler(),
wiresContainer);
return allow(parentNode,
childNode);
}
@Override
public boolean acceptDocking(final WiresContainer wiresContainer,
final WiresShape wiresShape) {
if (!isAccept(wiresContainer,
wiresShape)) {
return false;
}
final Node childNode = WiresUtils.getNode(getCanvasHandler(),
wiresShape);
final Node parentNode = WiresUtils.getNode(getCanvasHandler(),
wiresContainer);
return accept(parentNode,
childNode);
}
@Override
public int getHotspotSize() {
return HOTSPOT;
}
};
}