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