/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package automenta.netention.graph; import com.syncleus.dann.graph.Edge; import com.syncleus.dann.graph.Graph; import com.syncleus.dann.graph.MutableAdjacencyGraph; import java.util.LinkedList; import java.util.List; /** * * @author me */ public class NotifyingDirectedGraph<N, E extends Edge<N>> extends MutableAdjacencyGraph<N, E> { public static interface GraphListener<N, E extends Edge<N>> { public void onNodeAdded(N n); public void onNodeRemoved(N n); public void onEdgeAdded(E e); public void onEdgeRemoved(E e); } private List<GraphListener<N, E>> listeners = new LinkedList(); public NotifyingDirectedGraph() { super(); } public NotifyingDirectedGraph(Graph<N, E> graph) { super(graph); } /** adds a listener, and then calls onNodeAdded and onEdgeAdded for all existing nodes|edges */ public boolean addListener(GraphListener<N,E> l) { boolean b = listeners.add(l); if (b) { for (N n : getNodes()) { l.onNodeAdded(n); } for (E e : getEdges()) { l.onEdgeAdded(e); } return true; } return false; } public boolean removeListener(GraphListener<N,E> l) { return listeners.remove(l); } @Override public boolean add(E newEdge) { boolean b = super.add(newEdge); if (b) { for (GraphListener<N,E> g : listeners) { g.onEdgeAdded(newEdge); } return true; } return false; } @Override public boolean add(N newNode) { boolean b = super.add(newNode); if (b) { for (GraphListener<N,E> g : listeners) { g.onNodeAdded(newNode); } return true; } return false; } @Override public boolean remove(E edgeToRemove) { boolean b = super.remove(edgeToRemove); if (b) { for (GraphListener<N,E> g : listeners) { g.onEdgeRemoved(edgeToRemove); } return true; } return false; } @Override public boolean remove(N nodeToRemove) { boolean b = super.remove(nodeToRemove); if (b) { for (GraphListener<N,E> g : listeners) { g.onNodeRemoved(nodeToRemove); } return true; } return false; } }