package org.infoobject.magicmap.visualization.application;
import edu.uci.ics.jung.graph.impl.UndirectedSparseGraph;
import net.sf.magicmap.client.interfaces.NodeModelListener;
import net.sf.magicmap.client.model.location.MagicGraphEvent;
import net.sf.magicmap.client.model.node.*;
import net.sf.magicmap.client.visualization.NodeCanvas;
import net.sf.magicmap.client.visualization.VisualEdge;
import net.sf.magicmap.client.visualization.VisualNode;
import net.sf.magicmap.client.visualization.VisualizationContext;
import org.infoobject.core.relation.domain.RelationEdge;
import org.infoobject.magicmap.node.model.InformationObjectNodeGraph;
import org.infoobject.magicmap.node.model.InformationObjectNodeModel;
import org.infoobject.magicmap.visualization.layout.InformationNodeLayoutManager;
import java.util.HashMap;
import java.util.Map;
/**
* <p>
* Class VisualizationManager ZUSAMMENFASSUNG
* </p>
* <p>
* DETAILS
* </p>
*
* @author Jan Friderici
* Date: 09.08.2008
* Time: 19:15:45
*/
public class VisualizationManager {
private final InformationObjectNodeGraph graph;
private final InformationObjectNodeModel nodeModel;
private final NodeCanvas nodeCanvas;
private final Map<RelationEdge, VisualEdge> edgeMap = new HashMap<RelationEdge, VisualEdge>();
private final Map<Node, VisualNode> nodeMap = new HashMap<Node, VisualNode>();
private final InformationNodeLayoutManager layoutManager = new InformationNodeLayoutManager(new UndirectedSparseGraph());
private boolean started;
public VisualizationManager(InformationObjectNodeGraph graph, InformationObjectNodeModel nodeModel, NodeCanvas nodeCanvas) {
this.graph = graph;
this.nodeModel = nodeModel;
this.nodeCanvas = nodeCanvas;
graph.addNodeGraphListener(new NodeGraphListener() {
public void edgeAdded(MagicGraphEvent event) {
IMagicEdge edge = event.getEdge();
addEdge(edge.getSourceNode(), edge.getTargetNode());
}
public void edgeRemoved(MagicGraphEvent event) {
IMagicEdge edge = event.getEdge();
removeEdge((RelationEdge) edge);
}
});
nodeModel.addNodeModelListener(new NodeModelListener() {
public void nodeAddedEvent(Node node) {
if (node.isPhysical()) {
layoutManager.addNode(node);
}
}
public void nodeUpdatedEvent(Node node, int i, Object o) {
if (!node.isPhysical() && i == NodeModel.UPDATE_POSITION) {
layoutManager.move(node);
}
}
public void nodeRemovedEvent(Node node) {
}
});
}
private void removeEdge(RelationEdge edge) {
final VisualNode source = getVisualNode(edge.getSourceNode(), false);
final VisualNode target = getVisualNode(edge.getTargetNode(), false);
final VisualEdge visualEdge = (source != null && target != null) ? edgeMap.get(edge) : null;
if (visualEdge != null) {
nodeCanvas.removeEdge(edge);
}
layoutManager.removeRelation(edge);
}
private void addEdge(Node sourceNode, Node targetNode) {
System.out.println(getClass().getName() + " sourceNode = " + sourceNode);
System.out.println(getClass().getName() + " targetNode = " + targetNode);
RelationEdge relation = this.graph.getEdge(sourceNode, targetNode);
VisualEdge e = edgeMap.get(relation);
if (e == null) {
e = new VisualEdge(relation,
getVisualNode(relation.getSourceNode(), true),
getVisualNode(relation.getTargetNode(), true), getVisualizationContext());
edgeMap.put(relation, e);
this.nodeCanvas.addEdge(e);
}
layoutManager.addRelation(relation);
}
public void start() {
if (!started) {
layoutManager.start();
started = true;
}
}
public void stop() {
layoutManager.stop();
}
private VisualizationContext getVisualizationContext() {
return nodeCanvas.getContext();
}
private VisualNode getVisualNode(Node node, boolean createIfNotFound) {
VisualNode visualNode = nodeMap.get(node);
if (visualNode == null && createIfNotFound) {
visualNode = new VisualNode(node, getVisualizationContext());
this.nodeMap.put(node, visualNode);
this.nodeCanvas.addNode(visualNode);
}
return visualNode;
}
public void setMap(MapNode map) {
this.layoutManager.resize(map.getMapInfo().width, map.getMapInfo().height);
start();
}
}