/*
Copyright 2012 GanttProject Team
This file is part of GanttProject, an opensource project management tool.
GanttProject is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
GanttProject 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with GanttProject. If not, see <http://www.gnu.org/licenses/>.
*/
package biz.ganttproject.core.chart.scene.gantt;
import java.awt.Dimension;
import java.awt.Point;
/**
* Represents a line connecting two bars.
*
* @author dbarashev (Dmitry Barashev)
*/
public class Connector {
/**
* Vector is an origin point + direction
*/
public static class Vector {
public static final Dimension WEST = new Dimension(-1, 0);
public static final Dimension EAST = new Dimension(1, 0);
private final Point myPoint;
private final Dimension myUnitVector;
private final Vector myHProjection;
Vector(Point point, Dimension unitVector) {
myPoint = point;
myUnitVector = unitVector;
myHProjection = unitVector.height == 0 && point.y == 0 ? null :
new Vector(new Point(point.x, 0), new Dimension(unitVector.width, 0));
}
Point getPoint() {
return myPoint;
}
/**
* @return {@code true} if target point either equals to this vector origin or
* resides in a quarter-plane where this vector direction points to
*/
boolean reaches(Point targetPoint) {
return myPoint.equals(targetPoint)
|| (Integer.signum(targetPoint.x - myPoint.x) == Integer.signum(myUnitVector.width)
&& Integer.signum(targetPoint.y - myPoint.y) == Integer.signum(myUnitVector.height));
}
Point getPoint(int units) {
return new Point(myPoint.x + myUnitVector.width * units, myPoint.y + myUnitVector.height * units);
}
/**
* @return horizontal projection of this vector, with origin's y coordinate and moving direction
* set to zero
*/
Vector getHProjection() {
return myHProjection == null ? this : myHProjection;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("Vector{");
sb.append("myPoint=").append(myPoint);
sb.append(", myVector=").append(myUnitVector);
sb.append('}');
return sb.toString();
}
}
private final Vector myStart;
private final Vector myEnd;
private final String myStyle;
Connector(Vector start, Vector end, String style) {
myStart = start;
myEnd = end;
myStyle = style;
}
Vector getStart() {
return myStart;
}
Vector getEnd() {
return myEnd;
}
String getStyleName() {
return myStyle;
}
}