1 package org.simantics.district.network.ui;
\r
3 import org.simantics.db.Resource;
\r
4 import org.simantics.db.WriteGraph;
\r
5 import org.simantics.db.exception.DatabaseException;
\r
6 import org.simantics.db.exception.ServiceException;
\r
7 import org.simantics.db.layer0.util.Layer0Utils;
\r
8 import org.simantics.diagram.synchronization.IModifiableSynchronizationContext;
\r
9 import org.simantics.diagram.synchronization.SynchronizationHints;
\r
10 import org.simantics.diagram.synchronization.graph.AddElement;
\r
11 import org.simantics.diagram.synchronization.graph.GraphSynchronizationHints;
\r
12 import org.simantics.diagram.synchronization.graph.layer.GraphLayer;
\r
13 import org.simantics.diagram.synchronization.graph.layer.GraphLayerManager;
\r
14 import org.simantics.diagram.ui.DiagramModelHints;
\r
15 import org.simantics.district.network.DistrictNetworkUtil;
\r
16 import org.simantics.district.network.ontology.DistrictNetworkResource;
\r
17 import org.simantics.g2d.diagram.IDiagram;
\r
19 public class DNEdgeBuilder {
\r
21 private Resource diagramResource;
\r
22 private IDiagram diagram;
\r
23 private GraphLayerManager glm;
\r
25 public DNEdgeBuilder(Resource diagramResource, IDiagram diagram) {
\r
26 this.diagramResource = diagramResource;
\r
27 this.diagram = diagram;
\r
29 IModifiableSynchronizationContext context = diagram.getHint(SynchronizationHints.CONTEXT);
\r
30 glm = context.get(GraphSynchronizationHints.GRAPH_LAYER_MANAGER);
\r
33 public void create(WriteGraph graph, double[] start, double[] end) throws DatabaseException {
\r
35 DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
\r
37 // 1. Get diagram edge to construct
\r
38 Resource edge = getOrCreateEdge(graph);
\r
40 // 1.1 Give running name to connection and increment the counter attached to the diagram.
\r
41 AddElement.claimFreshElementName(graph, diagramResource, edge);
\r
44 Resource startVertex = getOrCreateVertex(graph, start);
\r
45 Resource endVertex = getOrCreateVertex(graph, end);
\r
47 graph.claim(edge, DN.HasStartVertex, startVertex);
\r
48 graph.claim(edge, DN.HasEndVertex, endVertex);
\r
50 // 7. Put the element on all the currently active layers if possible.
\r
52 putOnActiveLayer(graph, edge);
\r
53 putOnActiveLayer(graph, startVertex);
\r
54 putOnActiveLayer(graph, endVertex);
\r
57 Layer0Utils.addCommentMetadata(graph, "Added edge " + edge);
\r
58 graph.markUndoPoint();
\r
61 private void putOnActiveLayer(WriteGraph graph, Resource res) throws DatabaseException {
\r
62 glm.removeFromAllLayers(graph, res);
\r
63 glm.putElementOnVisibleLayers(diagram, graph, res);
\r
66 private Resource getOrCreateVertex(WriteGraph graph, double[] coords) throws DatabaseException {
\r
67 // TODO: check if vertex exists already, for now create always new
\r
68 Resource vertex = null;
\r
69 if (vertex == null) {
\r
70 vertex = DistrictNetworkUtil.createVertex(graph, diagramResource, coords);
\r
71 AddElement.claimFreshElementName(graph, diagramResource, vertex);
\r
76 private Resource getOrCreateEdge(WriteGraph graph) throws DatabaseException {
\r
77 return DistrictNetworkUtil.createEdge(graph, diagramResource);
\r