com.jgraph.graph
Class DefaultGraphModel

java.lang.Object
  extended byjavax.swing.undo.UndoableEditSupport
      extended bycom.jgraph.graph.DefaultGraphModel
All Implemented Interfaces:
GraphModel, java.io.Serializable

public class DefaultGraphModel
extends javax.swing.undo.UndoableEditSupport
implements java.io.Serializable, GraphModel

A simple implementation of a graph model.

See Also:
Serialized Form

Nested Class Summary
static class DefaultGraphModel.EmptyIterator
           
 class DefaultGraphModel.GraphModelEdit
          An implementation of GraphModelChange that can be added to the model event.
 class DefaultGraphModel.GraphModelLayerEdit
          An implementation of GraphViewChange.
 
Field Summary
protected  boolean asksAllowsChildren
          Indicates whether isLeaf is based on a node's allowsChildren value.
protected  boolean attributeStore
          Indicates whether this models consumes the UI's attribute changes.
protected  java.util.Iterator emptyIterator
          Default instance of an empty iterator.
protected  javax.swing.event.EventListenerList listenerList
          The list of listeners that listen to the model.
protected  java.util.List roots
          Set that contains all root cells of this model.
 
Fields inherited from class javax.swing.undo.UndoableEditSupport
compoundEdit, listeners, realSource, updateLevel
 
Constructor Summary
DefaultGraphModel()
          Constructs a model that is not an attribute store.
DefaultGraphModel(boolean attributeStore)
          Constructs a model who's isAttributeStore returns the specified value.
 
Method Summary
 boolean acceptsSource(java.lang.Object edge, java.lang.Object port)
          Returns true if port is a valid source for edge.
 boolean acceptsTarget(java.lang.Object edge, java.lang.Object port)
          Returns true if port is a valid target for edge.
 void addGraphModelListener(GraphModelListener l)
          Adds a listener for the GraphModelEvent posted after the graph changes.
protected  void connect(java.lang.Object edge, java.lang.Object port, boolean isSource, boolean remove)
          Connects or disconnects the edge and port in this model based on remove.
 boolean contains(java.lang.Object node)
          Returns true if node or one of its ancestors is in the model.
protected  DefaultGraphModel.GraphModelEdit createCellEdit(ConnectionSet cs, java.util.Map propertyMap, ParentMap pm, javax.swing.undo.UndoableEdit[] edits)
          Returns an edit that represents a change.
protected  DefaultGraphModel.GraphModelEdit createEdit(java.lang.Object[] inserted, java.lang.Object[] removed, java.util.Map attributes, java.util.Map properties, ConnectionSet cs, ParentMap pm)
           
protected  DefaultGraphModel.GraphModelEdit createInsertEdit(java.lang.Object[] cells, ConnectionSet cs, ParentMap pm, java.util.Map propertyMap, java.util.Map attributeMap)
          Returns an edit that represents an insert.
protected  DefaultGraphModel.GraphModelLayerEdit createLayerEdit(java.lang.Object[] cells, int layer)
           
protected  DefaultGraphModel.GraphModelEdit createRemoveEdit(java.lang.Object[] cells)
          Returns an edit that represents a remove.
 java.util.Iterator edges(java.lang.Object port)
          Returns an iterator of the edges connected to port.
 void edit(ConnectionSet cs, java.util.Map propertyMap, ParentMap pm, javax.swing.undo.UndoableEdit[] edits)
          Applies the propertyMap and the connection changes to the model.
protected  void fireGraphChanged(java.lang.Object source, GraphModelEvent.GraphModelChange edit)
           
 java.util.Map getAttributes(java.lang.Object node)
          Returns a Map that represents the properties for the specified cell.
 java.lang.Object getChild(java.lang.Object parent, int index)
          Returns the child of parent at index index in the parent's child array.
 int getChildCount(java.lang.Object parent)
          Returns the number of children of parent.
static java.util.Set getDescendants(GraphModel model, java.lang.Object[] cells)
          Flattens the given array of root cells by adding the roots and their descandants.
static java.util.Set getEdges(GraphModel model, java.lang.Object[] cells)
          Return the set of edges that are connected to the specified cells.
 GraphModelListener[] getGraphModelListeners()
          Return an array of all GraphModelListeners that were added to this model.
 int getIndexOfChild(java.lang.Object parent, java.lang.Object child)
          Returns the index of child in parent.
 int getIndexOfRoot(java.lang.Object root)
          Returns the index of root in the model.
 java.lang.Object getParent(java.lang.Object child)
          Returns the parent of child in the model.
 java.lang.Object getRootAt(int index)
          Returns the root at index index in the model.
 int getRootCount()
          Returns the number of roots in the model.
static java.lang.Object[] getRoots(GraphModel model)
          Returns the roots of the specified model as an array.
 java.lang.Object getSource(java.lang.Object edge)
          Returns the source of edge.
 java.lang.Object getTarget(java.lang.Object edge)
          Returns the target of edge.
protected  void handleConnection(ConnectionSet.Connection c)
          Inserts the specified connection into the model.
protected  ConnectionSet handleConnectionSet(ConnectionSet cs)
          Applies connectionSet to the model.
protected  java.lang.Object[] handleInsert(java.lang.Object[] cells)
          Inserts cells into the model.
protected  ParentMap handleParentMap(ParentMap parentMap)
          Applies cells to the model.
protected  java.util.Map handlePropertyMap(java.util.Map propertyMap)
          Applies propertyMap to the model.
protected  java.lang.Object[] handleRemove(java.lang.Object[] cells)
          Removes cells from the model.
 void insert(java.lang.Object[] roots, ConnectionSet cs, ParentMap pm, java.util.Map attributeMap)
          Inserts the cells and connections into the model, and passes attributeMap to the views.
 boolean isAttributeStore()
          Returns true if the model stores all attributes.
 boolean isLeaf(java.lang.Object node)
          Returns whether the specified node is a leaf node.
 boolean isOrdered()
          Returns true if the model order should be used.
 void remove(java.lang.Object[] roots)
          Removes cells from the model.
 void removeGraphModelListener(GraphModelListener l)
          Removes a listener previously added with addGraphModelListener().
 void toBack(java.lang.Object[] cells)
          Sends cells to back.
 void toFront(java.lang.Object[] cells)
          Brings cells to front.
 
Methods inherited from class javax.swing.undo.UndoableEditSupport
_postEdit, addUndoableEditListener, beginUpdate, createCompoundEdit, endUpdate, getUndoableEditListeners, getUpdateLevel, postEdit, removeUndoableEditListener, toString
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface com.jgraph.graph.GraphModel
addUndoableEditListener, removeUndoableEditListener
 

Field Detail

listenerList

protected transient javax.swing.event.EventListenerList listenerList
The list of listeners that listen to the model.


emptyIterator

protected transient java.util.Iterator emptyIterator
Default instance of an empty iterator.


roots

protected java.util.List roots
Set that contains all root cells of this model.


asksAllowsChildren

protected boolean asksAllowsChildren
Indicates whether isLeaf is based on a node's allowsChildren value.


attributeStore

protected boolean attributeStore
Indicates whether this models consumes the UI's attribute changes. Default is false.

Constructor Detail

DefaultGraphModel

public DefaultGraphModel()
Constructs a model that is not an attribute store.


DefaultGraphModel

public DefaultGraphModel(boolean attributeStore)
Constructs a model who's isAttributeStore returns the specified value.

Method Detail

getRootCount

public int getRootCount()
Returns the number of roots in the model. Returns 0 if the model is empty.

Specified by:
getRootCount in interface GraphModel
Returns:
the number of roots in the model

getRootAt

public java.lang.Object getRootAt(int index)
Returns the root at index index in the model. This should not return null if index is a valid index for the model (that is index >= 0 && index < getRootCount()).

Specified by:
getRootAt in interface GraphModel
Returns:
the root of at index index

getIndexOfRoot

public int getIndexOfRoot(java.lang.Object root)
Returns the index of root in the model. If root is null, returns -1.

Specified by:
getIndexOfRoot in interface GraphModel
Returns:
the index of the root in the model, or -1 if the parent is null

contains

public boolean contains(java.lang.Object node)
Returns true if node or one of its ancestors is in the model.

Specified by:
contains in interface GraphModel
Returns:
true if node is in the model

isAttributeStore

public boolean isAttributeStore()
Returns true if the model stores all attributes. Otherwise, the view attributes and model properties are stored in separate places, allowing a cell to have multiple attribute sets among different views ("view-dependent" attributes).

Specified by:
isAttributeStore in interface GraphModel
Returns:
true if the model handles attributes.

getAttributes

public java.util.Map getAttributes(java.lang.Object node)
Returns a Map that represents the properties for the specified cell. This properties have precedence over each view's attributes, regardless of isAttributeStore.

Specified by:
getAttributes in interface GraphModel
Returns:
properties of node as a Map

getSource

public java.lang.Object getSource(java.lang.Object edge)
Returns the source of edge. edge must be an object previously obtained from this data source.

Specified by:
getSource in interface GraphModel
Returns:
Object that represents the source of edge

getTarget

public java.lang.Object getTarget(java.lang.Object edge)
Returns the target of edge. edge must be an object previously obtained from this data source.

Specified by:
getTarget in interface GraphModel
Returns:
Object that represents the target of edge

acceptsSource

public boolean acceptsSource(java.lang.Object edge,
                             java.lang.Object port)
Returns true if port is a valid source for edge. edge and port must be objects previously obtained from this data source.

Specified by:
acceptsSource in interface GraphModel
Returns:
true if port is a valid source for edge.

acceptsTarget

public boolean acceptsTarget(java.lang.Object edge,
                             java.lang.Object port)
Returns true if port is a valid target for edge. edge and port must be objects previously obtained from this data source.

Specified by:
acceptsTarget in interface GraphModel
Returns:
true if port is a valid target for edge.

edges

public java.util.Iterator edges(java.lang.Object port)
Returns an iterator of the edges connected to port. port must be a object previously obtained from this data source. This method never returns null.

Specified by:
edges in interface GraphModel
Parameters:
port - a port in the graph, obtained from this data source
Returns:
Iterator that represents the connected edges

getParent

public java.lang.Object getParent(java.lang.Object child)
Returns the parent of child in the model. child must be a node previously obtained from this data source. This returns null if child is a root in the model.

Specified by:
getParent in interface GraphModel
Parameters:
child - a node in the graph, obtained from this data source
Returns:
the parent of child

getIndexOfChild

public int getIndexOfChild(java.lang.Object parent,
                           java.lang.Object child)
Returns the index of child in parent. If either the parent or child is null, returns -1.

Specified by:
getIndexOfChild in interface GraphModel
Parameters:
parent - a note in the tree, obtained from this data source
child - the node we are interested in
Returns:
the index of the child in the parent, or -1 if either the parent or the child is null

getChild

public java.lang.Object getChild(java.lang.Object parent,
                                 int index)
Returns the child of parent at index index in the parent's child array. parent must be a node previously obtained from this data source. This should not return null if index is a valid index for parent (that is index >= 0 && index < getChildCount(parent)).

Specified by:
getChild in interface GraphModel
Parameters:
parent - a node in the tree, obtained from this data source
Returns:
the child of parent at index index

getChildCount

public int getChildCount(java.lang.Object parent)
Returns the number of children of parent. Returns 0 if the node is a leaf or if it has no children. parent must be a node previously obtained from this data source.

Specified by:
getChildCount in interface GraphModel
Parameters:
parent - a node in the tree, obtained from this data source
Returns:
the number of children of the node parent

isLeaf

public boolean isLeaf(java.lang.Object node)
Returns whether the specified node is a leaf node. The way the test is performed depends on the.

Specified by:
isLeaf in interface GraphModel
Parameters:
node - the node to check
Returns:
true if the node is a leaf node

insert

public void insert(java.lang.Object[] roots,
                   ConnectionSet cs,
                   ParentMap pm,
                   java.util.Map attributeMap)
Inserts the cells and connections into the model, and passes attributeMap to the views. If the model is an attribute store, the attributeMap is absorbed by the model. Notifies the model- and undo listeners of the change.

Specified by:
insert in interface GraphModel

remove

public void remove(java.lang.Object[] roots)
Removes cells from the model. If removeChildren is true, the children are also removed. Notifies the model- and undo listeners of the change.

Specified by:
remove in interface GraphModel

edit

public void edit(ConnectionSet cs,
                 java.util.Map propertyMap,
                 ParentMap pm,
                 javax.swing.undo.UndoableEdit[] edits)
Applies the propertyMap and the connection changes to the model. The initial edits that triggered the call are considered to be part of this transaction. Notifies the model- and undo listeners of the change. Note: If only edits is non-null, the edits are directly passed to the UndoableEditListeners.

Specified by:
edit in interface GraphModel

toBack

public void toBack(java.lang.Object[] cells)
Sends cells to back.

Specified by:
toBack in interface GraphModel

toFront

public void toFront(java.lang.Object[] cells)
Brings cells to front.

Specified by:
toFront in interface GraphModel

createLayerEdit

protected DefaultGraphModel.GraphModelLayerEdit createLayerEdit(java.lang.Object[] cells,
                                                                int layer)

isOrdered

public boolean isOrdered()
Returns true if the model order should be used. Typically, this returns the value of isAttributeStore.

Specified by:
isOrdered in interface GraphModel

createInsertEdit

protected DefaultGraphModel.GraphModelEdit createInsertEdit(java.lang.Object[] cells,
                                                            ConnectionSet cs,
                                                            ParentMap pm,
                                                            java.util.Map propertyMap,
                                                            java.util.Map attributeMap)
Returns an edit that represents an insert.


createRemoveEdit

protected DefaultGraphModel.GraphModelEdit createRemoveEdit(java.lang.Object[] cells)
Returns an edit that represents a remove.


createCellEdit

protected DefaultGraphModel.GraphModelEdit createCellEdit(ConnectionSet cs,
                                                          java.util.Map propertyMap,
                                                          ParentMap pm,
                                                          javax.swing.undo.UndoableEdit[] edits)
Returns an edit that represents a change.


createEdit

protected DefaultGraphModel.GraphModelEdit createEdit(java.lang.Object[] inserted,
                                                      java.lang.Object[] removed,
                                                      java.util.Map attributes,
                                                      java.util.Map properties,
                                                      ConnectionSet cs,
                                                      ParentMap pm)

handleInsert

protected java.lang.Object[] handleInsert(java.lang.Object[] cells)
Inserts cells into the model. Returns the cells that were inserted (including descendants).


handleRemove

protected java.lang.Object[] handleRemove(java.lang.Object[] cells)
Removes cells from the model. Returns the cells that were removed as roots.


handleParentMap

protected ParentMap handleParentMap(ParentMap parentMap)
Applies cells to the model. Returns a parent map that may be used to undo this change.


handlePropertyMap

protected java.util.Map handlePropertyMap(java.util.Map propertyMap)
Applies propertyMap to the model. Returns a property map that may be used to undo this change.


handleConnectionSet

protected ConnectionSet handleConnectionSet(ConnectionSet cs)
Applies connectionSet to the model. Returns a connection set that may be used to undo this change.


handleConnection

protected void handleConnection(ConnectionSet.Connection c)
Inserts the specified connection into the model.


connect

protected void connect(java.lang.Object edge,
                       java.lang.Object port,
                       boolean isSource,
                       boolean remove)
Connects or disconnects the edge and port in this model based on remove. Subclassers should override this to update connectivity datastructures.


addGraphModelListener

public void addGraphModelListener(GraphModelListener l)
Adds a listener for the GraphModelEvent posted after the graph changes.

Specified by:
addGraphModelListener in interface GraphModel
Parameters:
l - the listener to add
See Also:
removeGraphModelListener(com.jgraph.event.GraphModelListener)

removeGraphModelListener

public void removeGraphModelListener(GraphModelListener l)
Removes a listener previously added with addGraphModelListener().

Specified by:
removeGraphModelListener in interface GraphModel
Parameters:
l - the listener to remove
See Also:
addGraphModelListener(com.jgraph.event.GraphModelListener)

fireGraphChanged

protected void fireGraphChanged(java.lang.Object source,
                                GraphModelEvent.GraphModelChange edit)

getGraphModelListeners

public GraphModelListener[] getGraphModelListeners()
Return an array of all GraphModelListeners that were added to this model.


getRoots

public static java.lang.Object[] getRoots(GraphModel model)
Returns the roots of the specified model as an array.


getEdges

public static java.util.Set getEdges(GraphModel model,
                                     java.lang.Object[] cells)
Return the set of edges that are connected to the specified cells. The array is flattened and then all attached edges that are not part of the cells array are returned.


getDescendants

public static java.util.Set getDescendants(GraphModel model,
                                           java.lang.Object[] cells)
Flattens the given array of root cells by adding the roots and their descandants. The resulting set contains all cells, which means it contains branches and leafs. Note: This is an iterative implementation. No recursion used.