]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.district.network.ui/src/org/simantics/district/network/ui/DNEdgeBuilder.java
Implement district features to Simantics platform
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / DNEdgeBuilder.java
1 package org.simantics.district.network.ui;\r
2 \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
18 \r
19 public class DNEdgeBuilder {\r
20     \r
21     private Resource diagramResource;\r
22     private IDiagram diagram;\r
23     private GraphLayerManager glm;\r
24 \r
25     public DNEdgeBuilder(Resource diagramResource, IDiagram diagram) {\r
26         this.diagramResource = diagramResource;\r
27         this.diagram = diagram;\r
28         \r
29         IModifiableSynchronizationContext context = diagram.getHint(SynchronizationHints.CONTEXT);\r
30         glm = context.get(GraphSynchronizationHints.GRAPH_LAYER_MANAGER);\r
31     }\r
32 \r
33     public void create(WriteGraph graph, double[] start, double[] end) throws DatabaseException {\r
34         \r
35         DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);\r
36         \r
37         // 1. Get diagram edge to construct\r
38         Resource edge = getOrCreateEdge(graph);\r
39         \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
42         \r
43         // 2. Add vertices\r
44         Resource startVertex = getOrCreateVertex(graph, start);\r
45         Resource endVertex = getOrCreateVertex(graph, end);\r
46         \r
47         graph.claim(edge, DN.HasStartVertex, startVertex);\r
48         graph.claim(edge, DN.HasEndVertex, endVertex);\r
49         \r
50         // 7. Put the element on all the currently active layers if possible.\r
51         if (glm != null) {\r
52             putOnActiveLayer(graph, edge);\r
53             putOnActiveLayer(graph, startVertex);\r
54             putOnActiveLayer(graph, endVertex);\r
55         }\r
56         \r
57         Layer0Utils.addCommentMetadata(graph, "Added edge " + edge);\r
58         graph.markUndoPoint();\r
59     }\r
60     \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
64     }\r
65 \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
72         }\r
73         return vertex;\r
74     }\r
75 \r
76     private Resource getOrCreateEdge(WriteGraph graph) throws DatabaseException {\r
77         return DistrictNetworkUtil.createEdge(graph, diagramResource);\r
78     }\r
79 \r
80 }\r