/*
* Copyright 2016 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.shape.view;
import java.util.ArrayList;
import java.util.List;
import com.ait.lienzo.client.core.shape.AbstractDirectionalMultiPointShape;
import com.ait.lienzo.client.core.shape.MultiPathDecorator;
import com.ait.lienzo.client.core.shape.Shape;
import com.ait.lienzo.client.core.shape.wires.MagnetManager;
import com.ait.lienzo.client.core.shape.wires.WiresConnector;
import com.ait.lienzo.client.core.shape.wires.WiresMagnet;
import com.ait.lienzo.client.core.shape.wires.WiresShape;
import com.ait.lienzo.client.core.shape.wires.handlers.WiresConnectorControl;
import com.ait.lienzo.shared.core.types.ColorName;
import org.kie.workbench.common.stunner.client.lienzo.canvas.wires.WiresUtils;
import org.kie.workbench.common.stunner.core.client.canvas.Point2D;
import org.kie.workbench.common.stunner.core.client.shape.view.HasControlPoints;
import org.kie.workbench.common.stunner.core.client.shape.view.HasDecorators;
import org.kie.workbench.common.stunner.core.client.shape.view.IsConnector;
import org.kie.workbench.common.stunner.core.client.shape.view.ShapeView;
public class WiresConnectorView<T> extends WiresConnector
implements
ShapeView<T>,
IsConnector<T>,
HasControlPoints<T>,
HasDecorators<Shape<?>> {
protected String uuid;
private WiresConnectorControl connectorControl;
public WiresConnectorView(final AbstractDirectionalMultiPointShape<?> line,
final MultiPathDecorator headDecorator,
final MultiPathDecorator tailDecorator) {
super(line,
headDecorator,
tailDecorator);
init();
}
public WiresConnectorView(final WiresMagnet headMagnet,
final WiresMagnet tailMagnet,
final AbstractDirectionalMultiPointShape<?> line,
final MultiPathDecorator headDecorator,
final MultiPathDecorator tailDecorator) {
super(headMagnet,
tailMagnet,
line,
headDecorator,
tailDecorator);
init();
}
private void init() {
getLine().setFillColor(ColorName.WHITE).setStrokeWidth(0);
}
@Override
@SuppressWarnings("unchecked")
public T setUUID(final String uuid) {
this.uuid = uuid;
WiresUtils.assertShapeUUID(this.getGroup(),
uuid);
return (T) this;
}
@Override
public String getUUID() {
return uuid;
}
@SuppressWarnings("unchecked")
public T setControl(final WiresConnectorControl connectorControl) {
this.connectorControl = connectorControl;
return (T) this;
}
public WiresConnectorControl getControl() {
return connectorControl;
}
@SuppressWarnings("unchecked")
public T connect(final ShapeView headShapeView,
final int _headMagnetsIndex,
final ShapeView tailShapeView,
final int _tailMagnetsIndex,
final boolean tailArrow,
final boolean headArrow) {
final WiresShape headWiresShape = (WiresShape) headShapeView;
final WiresShape tailWiresShape = (WiresShape) tailShapeView;
final MagnetManager.Magnets headMagnets = headWiresShape.getMagnets();
final MagnetManager.Magnets tailMagnets = tailWiresShape.getMagnets();
int headMagnetsIndex = _headMagnetsIndex;
int tailMagnetsIndex = _tailMagnetsIndex;
if (headMagnetsIndex < 0) {
headMagnetsIndex = 0;
}
if (tailMagnetsIndex < 0) {
tailMagnetsIndex = 0;
}
// Obtain the magnets.
WiresMagnet m0_1 = headMagnets.getMagnet(headMagnetsIndex);
WiresMagnet m1_1 = tailMagnets.getMagnet(tailMagnetsIndex);
// Update the magnets.
this.setHeadMagnet(m0_1);
this.setTailMagnet(m1_1);
return (T) this;
}
@Override
public void removeFromParent() {
// Remove the main line.
super.removeFromLayer();
}
@Override
public double getShapeX() {
return getGroup().getX();
}
@Override
public double getShapeY() {
return getGroup().getY();
}
@Override
@SuppressWarnings("unchecked")
public T setShapeX(final double x) {
getGroup().setX(x);
return (T) this;
}
@Override
@SuppressWarnings("unchecked")
public T setShapeY(final double y) {
getGroup().setY(y);
return (T) this;
}
@Override
public double getAlpha() {
return getGroup().getAlpha();
}
@Override
@SuppressWarnings("unchecked")
public T setAlpha(final double alpha) {
getGroup().setAlpha(alpha);
return (T) this;
}
@Override
public Point2D getShapeAbsoluteLocation() {
return WiresUtils.getAbsolute(getGroup());
}
@Override
public String getFillColor() {
return getLine().getFillColor();
}
@Override
@SuppressWarnings("unchecked")
public T setFillColor(final String color) {
getLine().setFillColor(color);
if (null != getHead()) {
getHead().setFillColor(color);
}
if (null != getTail()) {
getTail().setFillColor(color);
}
return (T) this;
}
@Override
public double getFillAlpha() {
return getLine().getFillAlpha();
}
@Override
@SuppressWarnings("unchecked")
public T setFillAlpha(final double alpha) {
getLine().setFillAlpha(alpha);
if (null != getHead()) {
getHead().setFillAlpha(alpha);
}
if (null != getTail()) {
getTail().setFillAlpha(alpha);
}
return (T) this;
}
@Override
public String getStrokeColor() {
return getLine().getStrokeColor();
}
@Override
@SuppressWarnings("unchecked")
public T setStrokeColor(final String color) {
getLine().setStrokeColor(color);
if (null != getHead()) {
getHead().setStrokeColor(color);
}
if (null != getTail()) {
getTail().setStrokeColor(color);
}
return (T) this;
}
@Override
public double getStrokeAlpha() {
return getLine().getStrokeAlpha();
}
@Override
@SuppressWarnings("unchecked")
public T setStrokeAlpha(final double alpha) {
getLine().setStrokeAlpha(alpha);
if (null != getHead()) {
getHead().setStrokeAlpha(alpha);
}
if (null != getTail()) {
getTail().setStrokeAlpha(alpha);
}
return (T) this;
}
@Override
public double getStrokeWidth() {
return getLine().getStrokeWidth();
}
@Override
@SuppressWarnings("unchecked")
public T setStrokeWidth(final double width) {
getLine().setStrokeWidth(width);
if (null != getHead()) {
getHead().setStrokeWidth(width);
}
if (null != getTail()) {
getTail().setStrokeWidth(width);
}
return (T) this;
}
@Override
@SuppressWarnings("unchecked")
public T moveToTop() {
getGroup().moveToTop();
return (T) this;
}
@Override
@SuppressWarnings("unchecked")
public T moveToBottom() {
getGroup().moveToBottom();
return (T) this;
}
@Override
@SuppressWarnings("unchecked")
public T moveUp() {
getGroup().moveUp();
return (T) this;
}
@Override
@SuppressWarnings("unchecked")
public T moveDown() {
getGroup().moveDown();
return (T) this;
}
@Override
@SuppressWarnings("unchecked")
public T showControlPoints(final ControlPointType type) {
if (null != getControl()) {
if (ControlPointType.POINTS.equals(type)) {
getControl().showControlPoints();
} else {
throw new UnsupportedOperationException("Control point type [" + type + "] not supported yet");
}
}
return (T) this;
}
@Override
@SuppressWarnings("unchecked")
public T hideControlPoints() {
if (null != getControl()) {
getControl().hideControlPoints();
}
return (T) this;
}
@Override
public boolean areControlsVisible() {
return getPointHandles().isVisible();
}
@Override
public void destroy() {
// Remove me.
super.destroy();
this.connectorControl = null;
}
@Override
public List<Shape<?>> getDecorators() {
final List<Shape<?>> decorators = new ArrayList<>(3);
decorators.add(getLine());
if (null != getHead()) {
decorators.add(getHead());
}
if (null != getTail()) {
decorators.add(getTail());
}
return decorators;
}
}