package com.algomagic.atn; import java.util.*; import att.grappa.*; public class EdgeUpdate extends AbstractUpdate implements Update, VisualizationConstants { private String _parentNodeName; private NodeUpdate _childNode; private String _type; private Collection _evidence; private boolean _local; public EdgeUpdate( String parentNodeName, NodeUpdate childNode, String type, boolean local, Collection evidence, int side ) { _parentNodeName = parentNodeName; _childNode = childNode; _type = type; _local = local; _evidence = evidence; _side = side; } public int initialize( VisualizationPanel visPanel ) { Graph graph = visPanel.getGraph( ); _childNode.initialize( visPanel ); Node n1 = graph.findNodeByName( _parentNodeName ); Node n2 = graph.findNodeByName( _childNode.getName( ) ); if( n1 != null && n2 != null ) { new Edge( graph, n1, n2 ); } else { if( n1 == null && n1 == null ) { throw new RuntimeException( _parentNodeName + " === " + _childNode.getName( ) ); } else if( n1 == null ) { throw new RuntimeException( _parentNodeName ); } else if( n2 == null ) { throw new RuntimeException( _childNode.getName( ) ); } } if( _local ) { visPanel.addCredentials( _evidence, _local ); } return 3; } public Collection getEvidence( ) { return _evidence; } public boolean getLocal( ) { return _local; } public String getType( ) { return _type; } public boolean apply( VisualizationPanel visPanel ) { Graph graph = visPanel.getGraph( ); Node n1 = graph.findNodeByName( _parentNodeName ); Node n2 = graph.findNodeByName( _childNode.getName( ) ); Edge e = getEdgeBetween( graph, n1, n2 ); visPanel.setEdgeProperties( e, _type, _local ); visPanel.clearSelection( ); _childNode.setNew( ); _childNode.apply( visPanel ); if( _local == false ) { visPanel.addCredentials( _evidence, _local ); } visPanel.highlightCredentials( _evidence, _local ); return true; } public void undo( VisualizationPanel visPanel ) { Graph graph = visPanel.getGraph( ); Node n1 = graph.findNodeByName( _parentNodeName ); Node n2 = graph.findNodeByName( _childNode.getName( ) ); Edge e = getEdgeBetween( graph, n1, n2 ); _childNode.undo( visPanel ); if( visPanel.getLocal( ) == false ) { visPanel.setShadow( e ); } else { visPanel.setInvis( e ); } } public Element getElement( VisualizationPanel visPanel ) { Graph graph = visPanel.getGraph( ); Node n1 = graph.findNodeByName( _parentNodeName ); Node n2 = graph.findNodeByName( _childNode.getName( ) ); return getEdgeBetween( graph, n1, n2 ); } public Node getChild( VisualizationPanel visPanel ) { Graph graph = visPanel.getGraph( ); return graph.findNodeByName( _childNode.getName( ) ); } public String getChildName( ) { return _childNode.getName( ); } private Edge getEdgeBetween( Graph g, Node head, Node tail ) { Enumeration edges = head.edgeElements( ); while( edges.hasMoreElements( ) ) { Edge e = (Edge) edges.nextElement( ); Node t = e.getHead( ); Node h = e.getTail( ); if( h.getName( ).equals( head.getName( ) ) && t.getName( ).equals( tail.getName( ) ) ) { return e; } } return null; } }