/* * This file is part of the OSMembrane project. * More informations under www.osmembrane.de * * The project is licensed under the GNU GENERAL PUBLIC LICENSE 3.0. * for more details about the license see http://www.osmembrane.de/license/ * * Source: $HeadURL$ ($Revision$) * Last changed: $Date$ */ package de.osmembrane.view.panels; import java.awt.Point; import java.awt.geom.Line2D; import java.awt.geom.Point2D; import de.osmembrane.resources.Constants; /** * A special pipeline link used only for the preview. * * @see PipelineLink * * @author tobias_kuhn * */ public class PipelinePreviewLink extends PipelineLink { private static final long serialVersionUID = -4333235292752505928L; /** * The source of the current preview */ protected PipelineFunction source; /** * The destination of the current preview */ protected Point target; /** * Creates a new {@link PipelinePreviewLink} * * @param panel * the {@link PipelinePanel} to put the link on */ public PipelinePreviewLink(PipelinePanel panel) { super(panel); this.line = new Line2D.Double(); this.color = Constants.DEFAULT_FUNCTIONGROUP_COLOR; } /** * Regenerates the coordinates of the line, if destination has moved. * Furthermore assigns the size and location. */ @Override public void regenerateLine() { Point2D leftAbs = new Point2D.Double(source.getX() + source.getWidth() / 2.0, source.getY() + source.getHeight() / 2.0); double basicX, basicY; double sizeX, sizeY; if (target.getX() < leftAbs.getX()) { // left basicX = source.getX() + source.getWidth(); sizeX = Math.max(source.getWidth(), basicX - target.getX()); basicX = basicX - sizeX; } else { // right basicX = source.getX(); sizeX = Math.max(source.getWidth(), target.getX() - basicX); } if (target.getY() < leftAbs.getY()) { // above basicY = source.getY() + source.getHeight(); sizeY = Math.max(source.getHeight(), basicY - target.getY()); basicY = basicY - sizeY; } else { // below basicY = source.getY(); sizeY = Math.max(source.getHeight(), target.getY() - basicY); } setLocation((int) basicX, (int) basicY); setSize((int) sizeX, (int) sizeY); Point2D left; Point2D right; double leftX, leftY; if (target.getX() < leftAbs.getX()) { // left leftX = getWidth() - source.getWidth() / 2.0; } else { // right leftX = source.getWidth() / 2.0; } if (target.getY() < leftAbs.getY()) { // above leftY = getHeight() - source.getHeight() / 2.0; } else { // below leftY = source.getHeight() / 2.0; } left = new Point2D.Double(leftX, leftY); right = new Point2D.Double(target.getX() - basicX, target.getY() - basicY); line.setLine(left, right); repaint(); } /** * Sets the source to connectionSource and sets the location to the same. * * @param connectionSource */ public void setSource(PipelineFunction connectionSource) { this.source = connectionSource; double newX = connectionSource.getLocation().x + 0.5 * connectionSource.getWidth(); double newY = connectionSource.getLocation().y + 0.5 * connectionSource.getHeight(); setLocation(new Point((int) newX, (int) newY)); setVisible(true); } /** * Sets the target to target * * @param target */ public void setTarget(Point target) { this.target = target; } }