/* * 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; /** * Represents a vertex of the graph, including name, id, * and several attributes. */ public class GraphVertex implements Comparable<GraphVertex> { private static Color DEFAULT_COLOR = Color.green; // Name of the vertex must be unique within the parent graph private String name = ""; // Label that will be displayed private String label = ""; private String tooltip = ""; /** The color in which this vertex is to be printed. */ private Color color = DEFAULT_COLOR; private Shape shape = Shape.DISC; /** True if the vertex shall never be included in the visualization. */ private boolean auxiliary = false; /** Position of this vertex. */ private Position position = new Position(); private int id = 0; /** True if the vertex is the source vertex of an edge. */ private boolean isSource = false; /** (Weighted) Edge degree of the vertex. */ private float degree = 0.0f; private float degreeOut = 0.0f; private NameVisibility showName = new NameVisibility(); /** * True if the vertex shall be displayed. Used for partial display of vertices * during zoom. */ private boolean showVertex = true; /** True if the position of this node should not be changed by the layouter. */ private boolean fixedPos = false; /** True if the vertex is reflexive and a self loop should be drawn. */ private boolean hasSelfLoop = false; public enum Shape { DISC, BOX, RBOX, FIXED_SIZE_BOX, FILLER_RECT } public GraphVertex(String name) { assert(name != null); this.name = name; } public GraphVertex(String name, int id) { this(name); assert(id >= 0); this.id = id; } public GraphVertex(String name, boolean auxiliary) { this(name); this.auxiliary = auxiliary; } public GraphVertex(String name, Position position, float degree) { this(name); assert(position != null); this.setPosition(position); this.degree = degree; } public GraphVertex(GraphVertex oldVertex) { name = oldVertex.name; label = oldVertex.label; tooltip = oldVertex.tooltip; id = oldVertex.id; isSource = oldVertex.isSource; degree = oldVertex.degree; degreeOut = oldVertex.degreeOut; color = oldVertex.color; shape = oldVertex.shape; showVertex = oldVertex.showVertex; auxiliary = oldVertex.auxiliary; fixedPos = oldVertex.fixedPos; hasSelfLoop = oldVertex.hasSelfLoop; showName = new NameVisibility(oldVertex.showName); position = new Position(oldVertex.position); } public int getId() { return id; } public void setId(int id) { this.id = id; } /** * @return The Position element of this class. * The object returned is the object stored in this Vertex. */ public Position getPosition() { return position; } /** * @param position The new position of this vertex. * The position is not copied and stored directly in this Vertex. */ public void setPosition(Position pos) { this.position = pos; } /** * Returns the euclidean distance from this vertex to a given vertex. * * @param vertex The other vertex. Must not be <code>null</code>. */ public float distanceTo(GraphVertex vertex) { assert vertex != null; return distanceTo(vertex.getPosition()); } /** * Returns the euclidean distance from this vertex to a given position. * * @param pos The position. Must not be <code>null</code>. */ public float distanceTo(Position pos) { assert pos != null; return getPosition().distanceTo(pos); } public String getLabel() { if ((label == null) || (label.equals(""))) { return name; } else { return label; } } public void setLabel(String label) { this.label = label; } public String getName() { return name; } public Color getColor() { return color; } /** * Sets this vertex to a given color. * * @param color The new color of this vertex. Must not be null. */ public void setColor(Color color) { assert color != null; this.color = color; } /** * Sets the default color for this vertex. */ public void resetColor() { this.color = DEFAULT_COLOR; } public float getDegree() { return degree; } public void setDegree(float degree) { this.degree = degree; } public float getDegreeOut() { return degreeOut; } public void setDegreeOut(float degreeOut) { this.degreeOut = degreeOut; } /** * @return the shape */ public Shape getShape() { return shape; } /** * @param shape the shape to set */ public void setShape(Shape shape) { this.shape = shape; } /** * Returns whether the label of this vertex is to be shown. */ public boolean isShowName() { return showName.isVisible(); } /** * Returns whether this vertex is to be shown. */ public boolean isShowVertex() { return showVertex; } public void setShowVertex(boolean showVertex) { this.showVertex = showVertex; } /** Returns whether this is an auxiliary vertex, which is never to be visualized. */ public boolean isAuxiliary() { return auxiliary; } public boolean isSource() { return isSource; } public void setIsSource(boolean isSource) { this.isSource = isSource; } /** * Sets the a given visibility priority of this to either <code>true</code> * or <code>false</code>. Note that setting the visibility of one priority * to false is not equivalent to unsetting a priority. */ public void setShowName(NameVisibility.Priority priority, boolean showName) { this.showName.setVisibility(priority, showName); } /** * Sets a show name priority equal to that of the given {@link GraphVertex}. */ public void setShowName(GraphVertex vertex) { showName = new NameVisibility(vertex.showName); } public void unsetShowName(NameVisibility.Priority priority) { showName.unsetVisibility(priority); } public void resetShowName() { showName.reset(); } public void setTooltip(String tooltip) { this.tooltip = tooltip; } public String getTooltip() { return tooltip; } public boolean hasFixedPos() { return fixedPos; } public void setFixedPos(boolean fixedPos) { this.fixedPos = fixedPos; } public boolean hasSelfLoop() { return hasSelfLoop; } @Override public String toString() { return getName(); } @Override public int compareTo(GraphVertex other) { int result = this.getName().compareTo(other.getName()); if (result == 0) { result = Integer.compare(this.getId(), other.getId()); } return result; } }