package org.jbpm.gd.common.notation;
import java.beans.PropertyChangeEvent;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.draw2d.geometry.Dimension;
import org.jbpm.gd.common.editor.CreationFactory;
import org.jbpm.gd.common.model.SemanticElement;
public class RootContainer extends AbstractNotationElement implements NodeContainer {
Dimension dimension;
List nodes = new ArrayList();
protected List danglingEdges = new ArrayList();
public void setDimension(Dimension newDimension) {
Dimension oldDimension = dimension;
dimension = newDimension;
firePropertyChange("dimension", oldDimension, newDimension);
}
public Dimension getDimension() {
return dimension;
}
public void addNode(Node node) {
nodes.add(node);
node.setContainer(this);
addArrivingEdges(node);
addLeavingEdges(node);
firePropertyChange("nodeAdd", null, node);
}
public void removeNode(Node node) {
removeArrivingEdges(node);
removeLeavingEdges(node);
nodes.remove(node);
node.setContainer(null);
firePropertyChange("nodeRemove", node, null);
}
public List getNodes() {
return nodes;
}
protected void removeNode(PropertyChangeEvent evt) {
SemanticElement jpdlElement = (SemanticElement)evt.getOldValue();
AbstractNotationElement notationElement = getRegisteredNotationElementFor(jpdlElement);
if (notationElement != null) {
jpdlElement.removePropertyChangeListener(notationElement);
removeNode((Node)notationElement);
// notationElement.unregister();
}
}
protected void addNode(PropertyChangeEvent evt) {
SemanticElement semanticElement = (SemanticElement)evt.getNewValue();
AbstractNotationElement notationElement = getRegisteredNotationElementFor(semanticElement);
if (notationElement == null) {
CreationFactory factory = new CreationFactory(semanticElement, getFactory());
notationElement = (AbstractNotationElement)factory.getNewObject();
}
addNode((Node)notationElement);
semanticElement.addPropertyChangeListener(notationElement);
}
protected void addLeavingEdges(Node node) {
}
protected void addArrivingEdges(Node node) {
}
protected void removeArrivingEdges(Node node) {
List list = node.getArrivingEdges();
for (int i = 0; i < list.size(); i++) {
Edge edge = (Edge)list.get(i);
node.removeArrivingEdge(edge);
danglingEdges.add(edge);
}
}
protected void removeLeavingEdges(Node node) {
List list = node.getLeavingEdges();
for (int i = 0; i < list.size(); i++) {
Edge edge = (Edge)list.get(i);
Node target = edge.getTarget();
if (target != null) {
target.removeArrivingEdge(edge);
}
node.removeLeavingEdge(edge);
SemanticElement semanticElement = edge.getSemanticElement();
if (semanticElement != null) {
semanticElement.removePropertyChangeListener(edge);
}
}
}
public void propertyChange(PropertyChangeEvent evt) {
super.propertyChange(evt);
}
}