1 package edu.uci.ics.jung.graph;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.Collections;
6 import java.util.LinkedList;
7 import java.util.List;
8
9 import edu.uci.ics.jung.graph.event.GraphEvent;
10 import edu.uci.ics.jung.graph.event.GraphEventListener;
11 import edu.uci.ics.jung.graph.util.EdgeType;
12
13
14
15
16
17
18 @SuppressWarnings("serial")
19 public class ObservableGraph<V,E> extends GraphDecorator<V,E> {
20
21 List<GraphEventListener<V,E>> listenerList =
22 Collections.synchronizedList(new LinkedList<GraphEventListener<V,E>>());
23
24
25
26
27 public ObservableGraph(Graph<V, E> delegate) {
28 super(delegate);
29 }
30
31
32
33
34 public void addGraphEventListener(GraphEventListener<V,E> l) {
35 listenerList.add(l);
36 }
37
38
39
40
41 public void removeGraphEventListener(GraphEventListener<V,E> l) {
42 listenerList.remove(l);
43 }
44
45 protected void fireGraphEvent(GraphEvent<V,E> evt) {
46 for(GraphEventListener<V,E> listener : listenerList) {
47 listener.handleGraphEvent(evt);
48 }
49 }
50
51
52
53
54 @Override
55 public boolean addEdge(E edge, Collection<? extends V> vertices) {
56 boolean state = super.addEdge(edge, vertices);
57 if(state) {
58 GraphEvent<V,E> evt = new GraphEvent.Edge<V,E>(delegate, GraphEvent.Type.EDGE_ADDED, edge);
59 fireGraphEvent(evt);
60 }
61 return state;
62 }
63
64
65
66
67 @Override
68 public boolean addEdge(E e, V v1, V v2, EdgeType edgeType) {
69 boolean state = super.addEdge(e, v1, v2, edgeType);
70 if(state) {
71 GraphEvent<V,E> evt = new GraphEvent.Edge<V,E>(delegate, GraphEvent.Type.EDGE_ADDED, e);
72 fireGraphEvent(evt);
73 }
74 return state;
75 }
76
77
78
79
80 @Override
81 public boolean addEdge(E e, V v1, V v2) {
82 boolean state = super.addEdge(e, v1, v2);
83 if(state) {
84 GraphEvent<V,E> evt = new GraphEvent.Edge<V,E>(delegate, GraphEvent.Type.EDGE_ADDED, e);
85 fireGraphEvent(evt);
86 }
87 return state;
88 }
89
90
91
92
93 @Override
94 public boolean addVertex(V vertex) {
95 boolean state = super.addVertex(vertex);
96 if(state) {
97 GraphEvent<V,E> evt = new GraphEvent.Vertex<V,E>(delegate, GraphEvent.Type.VERTEX_ADDED, vertex);
98 fireGraphEvent(evt);
99 }
100 return state;
101 }
102
103
104
105
106 @Override
107 public boolean removeEdge(E edge) {
108 boolean state = delegate.removeEdge(edge);
109 if(state) {
110 GraphEvent<V,E> evt = new GraphEvent.Edge<V,E>(delegate, GraphEvent.Type.EDGE_REMOVED, edge);
111 fireGraphEvent(evt);
112 }
113 return state;
114 }
115
116
117
118
119 @Override
120 public boolean removeVertex(V vertex) {
121
122
123
124 Collection<E> incident_edges = new ArrayList<E>(delegate.getIncidentEdges(vertex));
125 for (E e : incident_edges)
126 this.removeEdge(e);
127
128 boolean state = delegate.removeVertex(vertex);
129 if(state) {
130 GraphEvent<V,E> evt = new GraphEvent.Vertex<V,E>(delegate, GraphEvent.Type.VERTEX_REMOVED, vertex);
131 fireGraphEvent(evt);
132 }
133 return state;
134 }
135
136 }