]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/synchronization/graph/AddConnection.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / synchronization / graph / AddConnection.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.diagram.synchronization.graph;\r
13 \r
14 import org.simantics.db.Resource;\r
15 import org.simantics.db.WriteGraph;\r
16 import org.simantics.db.common.utils.OrderedSetUtils;\r
17 import org.simantics.db.exception.DatabaseException;\r
18 import org.simantics.diagram.content.ConnectionUtil;\r
19 import org.simantics.diagram.stubs.DiagramResource;\r
20 import org.simantics.diagram.synchronization.CopyAdvisor;\r
21 import org.simantics.diagram.synchronization.IModifiableSynchronizationContext;\r
22 import org.simantics.diagram.synchronization.ModificationAdapter;\r
23 import org.simantics.diagram.synchronization.SynchronizationHints;\r
24 import org.simantics.diagram.synchronization.graph.layer.GraphLayerManager;\r
25 import org.simantics.diagram.ui.DiagramModelHints;\r
26 import org.simantics.g2d.diagram.DiagramHints;\r
27 import org.simantics.g2d.diagram.DiagramMutator;\r
28 import org.simantics.g2d.diagram.IDiagram;\r
29 import org.simantics.g2d.element.ElementHints;\r
30 import org.simantics.g2d.element.ElementUtils;\r
31 import org.simantics.g2d.element.IElement;\r
32 import org.simantics.layer0.Layer0;\r
33 import org.simantics.structural.stubs.StructuralResource2;\r
34 \r
35 /**\r
36  * @author Tuukka Lehtonen\r
37  */\r
38 public class AddConnection extends ModificationAdapter {\r
39 \r
40     IModifiableSynchronizationContext context;\r
41     IDiagram                          diagram;\r
42     Resource                          diagramResource;\r
43     IElement                          element;\r
44     Resource                          copyOf;\r
45     Resource                          connectionClassResource;\r
46 \r
47     public AddConnection(IModifiableSynchronizationContext context, IDiagram diagram, IElement element) {\r
48         super(ADD_CONNECTION_PRIORITY);\r
49         this.context = context;\r
50         this.diagram = diagram;\r
51         this.diagramResource = diagram.getHint(DiagramModelHints.KEY_DIAGRAM_RESOURCE);\r
52         assert this.diagramResource != null;\r
53         this.element = element;\r
54         this.copyOf = element.getHint(ElementHints.KEY_COPY_OF_OBJECT);\r
55 \r
56         this.connectionClassResource = ElementUtils.checkedAdapt(element.getElementClass(), Resource.class);\r
57     }\r
58 \r
59     @Override\r
60     public void perform(WriteGraph graph) throws DatabaseException {\r
61         ConnectionUtil cu = new ConnectionUtil(graph);\r
62         DiagramMutator mutator = diagram.getHint(DiagramHints.KEY_MUTATOR);\r
63 \r
64         Resource resource = null;\r
65 \r
66         // 3. Try to copy the element from an existing element if requested.\r
67         if (copyOf != null) {\r
68             CopyAdvisor ca = diagram.getHint(SynchronizationHints.COPY_ADVISOR);\r
69             if (ca != null) {\r
70                 Resource sourceDiagram = graph.getPossibleObject(copyOf, Layer0.getInstance(graph).PartOf);\r
71                 if (sourceDiagram == null)\r
72                     sourceDiagram = OrderedSetUtils.getSingleOwnerList(graph, copyOf, DiagramResource.getInstance(graph).Diagram);\r
73                 resource = CopyAdvisorUtil.copy(context, graph, ca, copyOf, sourceDiagram, diagramResource);\r
74                 if (resource != null) {\r
75                     OrderedSetUtils.addFirst(graph, diagramResource, resource);\r
76                 }\r
77             }\r
78         }\r
79 \r
80         if (resource == null)\r
81             resource = cu.newConnection(diagramResource, connectionClassResource);\r
82 \r
83         if (copyOf != null)\r
84             copyConnectionType(graph, copyOf, resource);\r
85 \r
86         element.setHint(ElementHints.KEY_OBJECT, resource);\r
87         mutator.register(element, resource);\r
88 \r
89         GraphLayerManager glm = context.get(GraphSynchronizationHints.GRAPH_LAYER_MANAGER);\r
90         if (glm != null) {\r
91             glm.removeFromAllLayers(graph, resource);\r
92             glm.putElementOnVisibleLayers(diagram, graph, resource);\r
93         }\r
94     }\r
95 \r
96     public static void copyConnectionType(WriteGraph graph, Resource source, Resource target) throws DatabaseException {\r
97         // Copy HasConnectionType relation\r
98         StructuralResource2 sr = StructuralResource2.getInstance(graph);\r
99         Resource connectionType = graph.getPossibleObject(source, sr.HasConnectionType);\r
100         if (connectionType != null) {\r
101             graph.deny(target, sr.HasConnectionType);\r
102             graph.claim(target, sr.HasConnectionType, null, connectionType);\r
103         }\r
104     }\r
105 \r
106 }\r