/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2012-2013, Geomatys
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotoolkit.gui.swing.etl;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
import java.awt.geom.CubicCurve2D;
import org.netbeans.api.visual.action.ActionFactory;
import org.netbeans.api.visual.anchor.PointShape;
import org.netbeans.api.visual.widget.ConnectionWidget;
import static org.geotoolkit.gui.swing.etl.ChainEditorConstants.*;
import org.geotoolkit.processing.chain.model.DataLink;
/**
*
* @author Johann Sorel (Geomatys)
*/
public class WDataLink extends ConnectionWidget {
private final DataLink link;
public WDataLink(final ChainScene scene, final DataLink link) {
super(scene);
this.link = link;
getActions().addAction(ActionFactory.createReconnectAction(new ProviderParameterReconnect()));
getActions().addAction(ActionFactory.createAddRemoveControlPointAction());
getActions().addAction(ActionFactory.createFreeMoveControlPointAction());
setEndPointShape(PointShape.SQUARE_FILLED_BIG);
setTargetAnchorShape(ChainShapes.ANCHOR_INPUT);
setSourceAnchorShape(ChainShapes.ANCHOR_OUTPUT);
setLineColor(DEFAULT_LINE_COLOR);
getScene().validate();
}
public DataLink getLink() {
return link;
}
@Override
protected void paintWidget() {
Graphics2D gr = getGraphics();
gr.setColor(getForeground());
Point firstControlPoint = getFirstControlPoint();
Point lastControlPoint = getLastControlPoint();
firstControlPoint = new Point(firstControlPoint);
firstControlPoint.x += 4;
lastControlPoint = new Point(lastControlPoint);
lastControlPoint.x -= 4;
if(firstControlPoint != null && lastControlPoint != null){
final CubicCurve2D c = new CubicCurve2D.Double();
final int ext = Math.abs((firstControlPoint.x - lastControlPoint.x)*2)/3;
c.setCurve( firstControlPoint.x, firstControlPoint.y,
firstControlPoint.x+ext, firstControlPoint.y,
lastControlPoint.x-ext, lastControlPoint.y,
lastControlPoint.x, lastControlPoint.y);
gr.setColor(getLineColor());
gr.setStroke(getStroke());
gr.draw(c);
}
final double firstControlPointRotation = 0.0;
final double lastControlPointRotation = 0.0;
AffineTransform previousTransform;
if (firstControlPoint != null) {
previousTransform = gr.getTransform();
gr.translate(firstControlPoint.x, firstControlPoint.y);
if (getSourceAnchorShape().isLineOriented()) {
gr.rotate(firstControlPointRotation);
}
getSourceAnchorShape().paint(gr, true);
gr.setTransform(previousTransform);
}
if (lastControlPoint != null) {
previousTransform = gr.getTransform();
gr.translate(lastControlPoint.x, lastControlPoint.y);
if (getTargetAnchorShape().isLineOriented()) {
gr.rotate(lastControlPointRotation);
}
getTargetAnchorShape().paint(gr, false);
gr.setTransform(previousTransform);
}
}
@Override
protected Rectangle calculateClientArea() {
final Rectangle rect = super.calculateClientArea();
final Point firstControlPoint = getFirstControlPoint();
final Point lastControlPoint = getLastControlPoint();
// create new CubicCurve2D.Double
if(firstControlPoint != null && lastControlPoint != null){
final CubicCurve2D c = new CubicCurve2D.Double();
final int ext = Math.abs((firstControlPoint.x - lastControlPoint.x)*2)/3 ;
c.setCurve( firstControlPoint.x, firstControlPoint.y,
firstControlPoint.x+ext, firstControlPoint.y,
lastControlPoint.x-ext, lastControlPoint.y,
lastControlPoint.x, lastControlPoint.y);
rect.add(c.getBounds());
}
return rect;
}
}