blob: e532540299ce7b102ae8157f9e4797924de7387f [file] [log] [blame]
/*******************************************************************************
* Copyright 2005, CHISEL Group, University of Victoria, Victoria, BC, Canada.
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the Eclipse Public License v1.0 which
* accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors: The Chisel Group, University of Victoria
*******************************************************************************/
package org.eclipse.zest.layouts.exampleStructures;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.zest.layouts.LayoutEntity;
import org.eclipse.zest.layouts.LayoutGraph;
import org.eclipse.zest.layouts.LayoutRelationship;
/**
* Create a very simple graph that can be used in the layout algorithms
*
* @author Casey Best
* @author Chris Callendar
*/
public class SimpleGraph implements LayoutGraph {
Map objectsToNodes;
List relationships;
public SimpleGraph() {
objectsToNodes = new HashMap();
relationships = new ArrayList();
}
/**
* Adds the node.
* @param node The node to add.
*/
public void addEntity(LayoutEntity node) {
if (node instanceof SimpleNode) {
objectsToNodes.put(((SimpleNode) node).getRealObject(), node);
}
}
/**
* Creates a LayoutEntity containing an object.
*/
public LayoutEntity addObjectNode(Object object) {
SimpleNode simpleNode = (SimpleNode) objectsToNodes.get(object);
if (simpleNode == null) {
simpleNode = new SimpleNode(object);
objectsToNodes.put(object, simpleNode);
}
return simpleNode;
}
/**
* Add a relationship between two objects. Layout algorithms need to know
* whether a relationship is one way or bi-directional. This method assumes that
* all relationships are bi-direcional and have the same weight.
*/
public void addObjectRelationship(Object sourceNode, Object destinationNode) {
addObjectRelationship(sourceNode, destinationNode, true, 1);
}
/**
* Add a relationship between two objects. Layout algorithms need to know
* whether a relationship is one way or bi-directional.
*/
public void addObjectRelationship(Object sourceObject, Object destinationObject, boolean bidirectional, int weight) {
addObjectNode(sourceObject);
addObjectNode(destinationObject);
SimpleNode sourceNode = (SimpleNode) objectsToNodes.get(sourceObject);
SimpleNode destinationNode = (SimpleNode) objectsToNodes.get(destinationObject);
SimpleRelationship simpleRelationship = new SimpleRelationship(sourceNode, destinationNode, bidirectional, weight);
relationships.add(simpleRelationship);
}
/* (non-Javadoc)
* @see ca.uvic.cs.chisel.layouts.LayoutGraph#addRelationship(ca.uvic.cs.chisel.layouts.LayoutEntity, ca.uvic.cs.chisel.layouts.LayoutEntity)
*/
public void addRelationship(LayoutEntity srcNode, LayoutEntity destNode) {
addRelationship(srcNode, destNode, true, 1);
}
/* (non-Javadoc)
* @see ca.uvic.cs.chisel.layouts.LayoutGraph#addRelationship(ca.uvic.cs.chisel.layouts.LayoutEntity, ca.uvic.cs.chisel.layouts.LayoutEntity, boolean, int)
*/
public void addRelationship(LayoutEntity srcNode, LayoutEntity destNode, boolean bidirectional, int weight) {
addEntity(srcNode);
addEntity(destNode);
SimpleRelationship rel = new SimpleRelationship(srcNode, destNode, bidirectional, weight);
relationships.add(rel);
}
/* (non-Javadoc)
* @see ca.uvic.cs.chisel.layouts.LayoutGraph#addRelationship(ca.uvic.cs.chisel.layouts.LayoutRelationship)
*/
public void addRelationship(LayoutRelationship relationship) {
relationships.add(relationship);
}
/**
* Returns a list of SimpleNodes that represent the objects added to this graph using addNode. Note that
* any manipulation to this graph was done on the SimpleNodes, not the real objects. You
* must still manipulate them yourself.
*/
public List getEntities() {
return new ArrayList(objectsToNodes.values());
}
/**
* Returns a list of SimpleRelationships that represent the objects added to this graph using addRelationship.
*/
public List getRelationships() {
return relationships;
}
/**
* Checks the relationships to see if they are all bidirectional.
* @return boolean if all edges are bidirectional.
*/
public boolean isBidirectional() {
boolean isBidirectional = true;
for (Iterator iter = relationships.iterator(); iter.hasNext();) {
SimpleRelationship rel = (SimpleRelationship) iter.next();
if (!rel.isBidirectionalInLayout()) {
isBidirectional = false;
break;
}
}
return isBidirectional;
}
}