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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.diagram.query;
\r
14 import java.util.Set;
\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
47 * @author Tuukka Lehtonen
\r
49 public class DiagramRequests {
\r
55 public static Read<PageDesc> getPageDesc(final Resource diagram, final PageDesc defaultValue) {
\r
56 return new Read<PageDesc>() {
\r
58 public PageDesc perform(ReadGraph graph) throws DatabaseException {
\r
59 return DiagramGraphUtil.getPageDesc(graph, diagram, defaultValue);
\r
64 public static Read<DiagramDesc> getDiagramDesc(final Resource diagram) {
\r
65 return new DiagramDescRead(diagram);
\r
69 * Adapt a diagram Element type resource into an {@link ElementClass}.
\r
71 * @param elementType
\r
75 public static AsyncRead<ElementClass> getElementClass(Resource elementType, IHintObservable hints) {
\r
76 return new ElementClassQuery(elementType, hints);
\r
83 * @param loadListener
\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
93 * @param structuralPath
\r
95 * @param initialHints
\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
107 public static Read<IModelingRules> getModelingRules(final Resource diagram, final IModelingRules defaultValue) {
\r
108 return new Read<IModelingRules>() {
\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
114 return defaultValue;
\r
115 return graph.adapt(rules, IModelingRules.class);
\r
121 * @param connectionType
\r
124 public static Read<ConnectionVisuals> getConnectionVisuals(Resource connectionType) {
\r
125 return new ConnectionVisualsRequest(connectionType);
\r
132 public static Read<String[]> getFlagText(Resource flag) {
\r
133 return new FlagTextQuery(flag);
\r
136 public static Read<Resource> getFlagPair(Resource flag) {
\r
137 return new FlagPairQuery(flag);
\r
144 public static Read<TerminalMap> elementTypeTerminals(Resource elementType) {
\r
145 return new ResourceRead<TerminalMap>(elementType) {
\r
147 public TerminalMap perform(ReadGraph graph) throws DatabaseException {
\r
148 return DiagramGraphUtil.getElementTypeTerminals(graph, resource);
\r
157 public static Read<TerminalMap> elementTerminals(Resource element) {
\r
158 return new ResourceRead<TerminalMap>(element) {
\r
160 public TerminalMap perform(ReadGraph graph) throws DatabaseException {
\r
161 return DiagramGraphUtil.getElementTerminals(graph, resource);
\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
170 public static void expandConnections(ReadGraph graph, Resource connection, Set<Resource> conns, Set<IConnectionPoint> cps) throws DatabaseException {
\r
172 if(!conns.add(connection)) return;
\r
174 DiagramResource DIA = DiagramResource.getInstance(graph);
\r
175 StructuralResource2 STR = StructuralResource2.getInstance(graph);
\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
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