]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/query/DiagramRequests.java
IConnectionPoint and canBeConnected-checking util to SCL
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / query / DiagramRequests.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.query;
13
14 import java.util.Set;
15
16 import org.eclipse.core.runtime.IProgressMonitor;
17 import org.simantics.db.ReadGraph;
18 import org.simantics.db.Resource;
19 import org.simantics.db.Statement;
20 import org.simantics.db.common.ResourceArray;
21 import org.simantics.db.common.request.ResourceRead;
22 import org.simantics.db.exception.DatabaseException;
23 import org.simantics.db.procedure.Listener;
24 import org.simantics.db.request.AsyncRead;
25 import org.simantics.db.request.Read;
26 import org.simantics.diagram.adapter.IDiagramLoader;
27 import org.simantics.diagram.adapter.NodeRequest;
28 import org.simantics.diagram.connection.ConnectionVisuals;
29 import org.simantics.diagram.content.TerminalMap;
30 import org.simantics.diagram.flag.FlagUtil;
31 import org.simantics.diagram.stubs.DiagramResource;
32 import org.simantics.diagram.synchronization.graph.DiagramGraphUtil;
33 import org.simantics.g2d.canvas.ICanvasContext;
34 import org.simantics.g2d.diagram.IDiagram;
35 import org.simantics.g2d.element.ElementClass;
36 import org.simantics.g2d.element.IElement;
37 import org.simantics.g2d.page.DiagramDesc;
38 import org.simantics.structural.stubs.StructuralResource2;
39 import org.simantics.structural2.modelingRules.CPConnection;
40 import org.simantics.structural2.modelingRules.CPTerminal;
41 import org.simantics.structural2.modelingRules.IConnectionPoint;
42 import org.simantics.structural2.modelingRules.IModelingRules;
43 import org.simantics.utils.datastructures.hints.IHintObservable;
44 import org.simantics.utils.page.PageDesc;
45
46 /**
47  * @author Tuukka Lehtonen
48  */
49 public class DiagramRequests {
50
51     /**
52      * @param diagram
53      * @return
54      */
55     public static Read<PageDesc> getPageDesc(final Resource diagram, final PageDesc defaultValue) {
56         return new Read<PageDesc>() {
57             @Override
58             public PageDesc perform(ReadGraph graph) throws DatabaseException {
59                 return DiagramGraphUtil.getPageDesc(graph, diagram, defaultValue);
60             }
61         };
62     }
63
64     public static Read<DiagramDesc> getDiagramDesc(final Resource diagram) {
65         return new DiagramDescRead(diagram);
66     }
67
68     /**
69      * Adapt a diagram Element type resource into an {@link ElementClass}.
70      * 
71      * @param elementType
72      * @param hints
73      * @return
74      */
75     public static AsyncRead<ElementClass> getElementClass(Resource elementType, IHintObservable hints) {
76         return new ElementClassQuery(elementType, hints);
77     }
78
79     /**
80      * @param canvas
81      * @param diagram
82      * @param element
83      * @param loadListener
84      * @return
85      */
86     public static AsyncRead<IElement> getElement(ICanvasContext canvas, IDiagram diagram, Resource element, Listener<IElement> loadListener) {
87         return new NodeRequest(canvas, diagram, element, loadListener);
88     }
89
90     /**
91      * @param monitor
92      * @param resource
93      * @param structuralPath
94      * @param loader
95      * @param initialHints
96      * @return
97      */
98     public static Read<IDiagram> loadDiagram(IProgressMonitor monitor, Resource model, Resource resource, Resource runtime, ResourceArray structuralPath,
99             IDiagramLoader loader, IHintObservable initialHints) {
100         return new DiagramLoadQuery(monitor, model, resource, runtime, structuralPath, loader, initialHints);
101     }
102
103     /**
104      * @param diagram
105      * @return
106      */
107     public static Read<IModelingRules> getModelingRules(final Resource diagram, final IModelingRules defaultValue) {
108         return new Read<IModelingRules>() {
109             @Override
110             public IModelingRules perform(ReadGraph graph) throws DatabaseException {
111                 return DiagramGraphUtil.getModelingRules(graph, diagram, defaultValue);
112             }
113         };
114     }
115
116     /**
117      * @param connectionType
118      * @return
119      */
120     public static Read<ConnectionVisuals> getConnectionVisuals(Resource connectionType) {
121         return new ConnectionVisualsRequest(connectionType);
122     }
123
124     /**
125      * @param flag
126      * @return
127      */
128     public static Read<String[]> getFlagText(Resource flag) {
129         return new FlagTextQuery(flag);
130     }
131
132     public static Read<Resource> getFlagPair(Resource flag) {
133         return new FlagPairQuery(flag);
134     }
135
136     /**
137      * @param element
138      * @return
139      */
140     public static Read<TerminalMap> elementTypeTerminals(Resource elementType) {
141         return new ResourceRead<TerminalMap>(elementType) {
142             @Override
143             public TerminalMap perform(ReadGraph graph) throws DatabaseException {
144                 return DiagramGraphUtil.getElementTypeTerminals(graph, resource);
145             }
146         };
147     }
148
149     /**
150      * @param element
151      * @return
152      */
153     public static Read<TerminalMap> elementTerminals(Resource element) {
154         return new ResourceRead<TerminalMap>(element) {
155             @Override
156             public TerminalMap perform(ReadGraph graph) throws DatabaseException {
157                 return DiagramGraphUtil.getElementTerminals(graph, resource);
158             }
159         };
160     }
161
162     /**
163      * Browses all diagram connections that are related to {@code connection} by flags.
164      * Adds the connections to set {@code conns} and all related connection points to set {@code cps}.
165      */
166         public static void expandConnections(ReadGraph graph, Resource connection, Set<Resource> conns, Set<IConnectionPoint> cps) throws DatabaseException {
167
168                 if(!conns.add(connection)) return;
169
170                 DiagramResource DIA = DiagramResource.getInstance(graph);
171                 StructuralResource2 STR = StructuralResource2.getInstance(graph);
172
173                 cps.add(new CPConnection(connection));
174                 for(Resource connector : graph.getObjects(connection, DIA.HasConnector)) {
175                         for(Statement stm : graph.getStatements(connector, STR.Connects)) {
176                                 Resource element = stm.getObject();
177                                 if(element.equals(connection)) continue;
178                                 if(graph.isInstanceOf(element, DIA.Flag)) {
179                                         FlagUtil.forCounterparts(graph, element, (otherFlag) -> {
180                                                 Resource flagConnector = graph.getPossibleObject(otherFlag, DIA.Flag_ConnectionPoint);
181                                                 if(flagConnector != null) {
182                                                         Resource otherConnection = graph.getPossibleObject(flagConnector, DIA.IsConnectorOf);
183                                                         if(otherConnection != null) {
184                                                                 expandConnections(graph, otherConnection, conns, cps);
185                                                         }
186                                                 }
187                                         });
188                                 } else {
189                                         Resource connectionPoint = graph.getInverse(stm.getPredicate());
190                                         //System.err.println("term: " + NameUtils.getSafeName(graph, element) + " : " + NameUtils.getSafeName(graph, connectionPoint));
191                                         cps.add(new CPTerminal(element, connectionPoint));
192                                 }
193                         }
194                 }
195
196         }
197     
198 }