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