/*
Copyright 2008-2010 Gephi
Authors : Jeremy Subtil <jeremy.subtil@gephi.org>
Website : http://www.gephi.org
This file is part of Gephi.
Gephi is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
Gephi 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with Gephi. If not, see <http://www.gnu.org/licenses/>.
*/
package org.gephi.preview;
import java.awt.Color;
import org.gephi.graph.api.Edge;
import org.gephi.preview.api.CubicBezierCurve;
import org.gephi.preview.api.SelfLoop;
import org.gephi.preview.supervisors.SelfLoopSupervisorImpl;
import org.gephi.preview.util.Vector;
/**
* Implementation of a preview self-loop.
*
* @author Jérémy Subtil <jeremy.subtil@gephi.org>
*/
public class SelfLoopImpl extends AbstractEdge implements SelfLoop {
private final NodeImpl node;
private CubicBezierCurveImpl curve;
protected final Color originalColor;
/**
* Constructor.
*
* @param parent the parent graph of the self-loop
* @param thickness the self-loop's thickness
* @param node the self-loop's related node
*/
public SelfLoopImpl(GraphImpl parent, Edge edge, float thickness, NodeImpl node) {
super(parent, thickness);
this.node = node;
//Color
if (edge.getEdgeData().r() != -1) {
originalColor = new Color(edge.getEdgeData().r(), edge.getEdgeData().g(), edge.getEdgeData().b(), edge.getEdgeData().alpha());
} else {
originalColor = null;
}
// generate the self-loop's curve
genCurve();
// register the self-loop to its supervisor
getSelfLoopSupervisor().addSelfLoop(this);
}
/**
* Generates the self-loop's curve.
*/
private void genCurve() {
Vector v1 = new Vector(node.getPosition());
v1.add(node.getDiameter(), -node.getDiameter(), 0);
Vector v2 = new Vector(node.getPosition());
v2.add(node.getDiameter(), node.getDiameter(), 0);
curve = new CubicBezierCurveImpl(
node.getPosition(),
new PointImpl(v1),
new PointImpl(v2),
node.getPosition());
}
/**
* Returns the self-loop's related node.
*
* @return the self-loop's related node
*/
public NodeImpl getNode() {
return node;
}
/**
* Alias of getNode().
*
* @return the self-loop's related node
* @see getNode()
*/
public NodeImpl getNode1() {
return getNode();
}
/**
* Alias of getNode().
*
* @return the self-loop's related node
* @see getNode()
*/
public NodeImpl getNode2() {
return getNode();
}
/**
* Returns the self-loop's curve.
*
* @return the self-loop's curve
*/
public CubicBezierCurve getCurve() {
return curve;
}
public Color getOriginalColor() {
return originalColor;
}
/**
* Returns the self-loop supervisor.
*
* @return the controller's self-loop supervisor
*/
public SelfLoopSupervisorImpl getSelfLoopSupervisor() {
return (SelfLoopSupervisorImpl) parent.getModel().getSelfLoopSupervisor();
}
public Float getScale() {
return getSelfLoopSupervisor().getEdgeScale();
}
}