/******************************************************************************* * 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; } }