/*
* CCVisu is a tool for visual graph clustering
* and general force-directed graph layout.
* This file is part of CCVisu.
*
* Copyright (C) 2005-2012 Dirk Beyer
*
* CCVisu 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; either
* version 2.1 of the License, or (at your option) any later version.
*
* CCVisu 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with CCVisu; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Please find the GNU Lesser General Public License in file
* license_lgpl.txt or http://www.gnu.org/licenses/lgpl.txt
*
* Dirk Beyer (firstname.lastname@uni-passau.de)
* University of Passau, Bavaria, Germany
*/
package org.sosy_lab.ccvisu.graph;
import java.awt.Color;
import com.google.common.collect.ComparisonChain;
/**
* Represents an edge between two vertices source and target
* (given as vertex ids) of a given weight.
*/
public class GraphEdge implements Comparable<GraphEdge> {
/** Source vertex of edge.*/
private GraphVertex source = null;
/** Target vertex of edge.*/
private GraphVertex target = null;
/** Edge weight.*/
private float weight = 1.0f;
/** True if the edge shall never be included in the visualization.*/
private boolean auxiliary = false;
/** The color of the edge.*/
private Color color = Color.BLACK;
/** The name of the relation the edge belongs to. */
private String relName = "Edge";
/** Indicates whether this edge is to be painted solid or dashed.*/
private boolean dashed = false;
/** True if the edge shall be displayed.
* Used for partial display of edges during highlighting. */
private boolean showEdge = false;
/** True if the name shall be annotated in the visualization.*/
private boolean showName = false;
/** The unique id of this edge in a graph. */
private int id;
public GraphEdge(String pName, GraphVertex pU, GraphVertex pV, float pWeight) {
this(pName, pU, pV, Color.BLACK, false);
setWeight(pWeight);
}
public GraphEdge(String pName, GraphVertex pSource, GraphVertex pTarget,
Color pColor, boolean pAuxiliary) {
relName = pName;
source = pSource;
target = pTarget;
color = pColor;
auxiliary = pAuxiliary;
}
/**
* Copy constructor. Creates a new GraphEdge similar to the old one but
* sets a different source and target.
*/
public GraphEdge(GraphEdge edge, GraphVertex source, GraphVertex target) {
this(edge.relName, source, target, edge.color, edge.auxiliary);
this.weight = edge.weight;
this.id = edge.id;
this.showName = edge.showName;
this.showEdge = edge.showEdge;
this.dashed = edge.dashed;
}
/**
* @return The source of this edge.
*/
public GraphVertex getSource() {
return source;
}
/**
* @return The target of this edge.
*/
public GraphVertex getTarget() {
return target;
}
/**
* @return The name of the relation.
*/
public String getRelName() {
return relName;
}
/**
* @return The weight of this edge.
*/
public float getWeight() {
return weight;
}
/**
* @param weight The new weight of this edge.
*/
public void setWeight(float w) {
this.weight = w;
}
/**
* Returns the length of this edge.
*/
public float getLength() {
return getSource().distanceTo(getTarget());
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
/**
* @return The color of the edge.
*/
public Color getColor() {
return color;
}
/**
* @param color The new color of the edge.
*/
public void setColor(Color color) {
this.color = color;
}
/**
* Returns whether this edge is an auxiliary edge, which is not supposed to
* be visualized.
*/
public boolean isAuxiliaryEdge() {
return auxiliary;
}
/**
* @return Whether this edge is to be shown in a graph visualization.
*/
public boolean showEdge() {
return showEdge;
}
/**
* Sets the visibility of this edge.
*
* @param showEdge <code>true</code> if this edge is to be shown, <code>false</code> otherwise.
*/
public void setShowEdge(boolean showEdge) {
this.showEdge = showEdge;
}
/**
* Returns whether the relation name of this edge is to be shown in visualizations.
*/
public boolean showName() {
return showName;
}
/**
* Set whether the name of this edge is to be shown in visualizations.
*/
public void setShowName(boolean showName) {
this.showName = showName;
}
/**
* Returns whether this edge is to be visualized dashed (instead of solid).
*/
public boolean isDashed() {
return dashed;
}
/**
* @param dashed <code>true</code> if the edge is to be visualized as a dashed line,
* <code>false</code> if it is to be solid.
*/
public void setDashed(boolean dashed) {
this.dashed = dashed;
}
@Override
public int compareTo(GraphEdge edge) {
return ComparisonChain.start()
.compare(this.getSource().getId(), edge.getSource().getId())
.compare(this.getTarget().getId(), edge.getTarget().getId())
.compare(this.getWeight(), edge.getWeight())
.compare(this.color.getRGB(), edge.color.getRGB())
.compareTrueFirst(this.showName, edge.showName)
.compareTrueFirst(this.showEdge, edge.showEdge)
.compareTrueFirst(this.auxiliary, edge.auxiliary)
.compare(this.relName, edge.relName)
.result();
}
}