--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.diagram.query;\r
+\r
+import java.util.Set;\r
+\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.Statement;\r
+import org.simantics.db.common.ResourceArray;\r
+import org.simantics.db.common.request.ResourceRead;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.procedure.Listener;\r
+import org.simantics.db.request.AsyncRead;\r
+import org.simantics.db.request.Read;\r
+import org.simantics.diagram.adapter.IDiagramLoader;\r
+import org.simantics.diagram.adapter.NodeRequest;\r
+import org.simantics.diagram.connection.ConnectionVisuals;\r
+import org.simantics.diagram.content.TerminalMap;\r
+import org.simantics.diagram.flag.FlagUtil;\r
+import org.simantics.diagram.stubs.DiagramResource;\r
+import org.simantics.diagram.synchronization.graph.DiagramGraphUtil;\r
+import org.simantics.g2d.canvas.ICanvasContext;\r
+import org.simantics.g2d.diagram.IDiagram;\r
+import org.simantics.g2d.element.ElementClass;\r
+import org.simantics.g2d.element.IElement;\r
+import org.simantics.g2d.page.DiagramDesc;\r
+import org.simantics.structural.stubs.StructuralResource2;\r
+import org.simantics.structural2.modelingRules.CPConnection;\r
+import org.simantics.structural2.modelingRules.CPTerminal;\r
+import org.simantics.structural2.modelingRules.IConnectionPoint;\r
+import org.simantics.structural2.modelingRules.IModelingRules;\r
+import org.simantics.utils.datastructures.hints.IHintObservable;\r
+import org.simantics.utils.page.PageDesc;\r
+\r
+/**\r
+ * @author Tuukka Lehtonen\r
+ */\r
+public class DiagramRequests {\r
+\r
+ /**\r
+ * @param diagram\r
+ * @return\r
+ */\r
+ public static Read<PageDesc> getPageDesc(final Resource diagram, final PageDesc defaultValue) {\r
+ return new Read<PageDesc>() {\r
+ @Override\r
+ public PageDesc perform(ReadGraph graph) throws DatabaseException {\r
+ return DiagramGraphUtil.getPageDesc(graph, diagram, defaultValue);\r
+ }\r
+ };\r
+ }\r
+\r
+ public static Read<DiagramDesc> getDiagramDesc(final Resource diagram) {\r
+ return new DiagramDescRead(diagram);\r
+ }\r
+\r
+ /**\r
+ * Adapt a diagram Element type resource into an {@link ElementClass}.\r
+ * \r
+ * @param elementType\r
+ * @param hints\r
+ * @return\r
+ */\r
+ public static AsyncRead<ElementClass> getElementClass(Resource elementType, IHintObservable hints) {\r
+ return new ElementClassQuery(elementType, hints);\r
+ }\r
+\r
+ /**\r
+ * @param canvas\r
+ * @param diagram\r
+ * @param element\r
+ * @param loadListener\r
+ * @return\r
+ */\r
+ public static AsyncRead<IElement> getElement(ICanvasContext canvas, IDiagram diagram, Resource element, Listener<IElement> loadListener) {\r
+ return new NodeRequest(canvas, diagram, element, loadListener);\r
+ }\r
+\r
+ /**\r
+ * @param monitor\r
+ * @param resource\r
+ * @param structuralPath\r
+ * @param loader\r
+ * @param initialHints\r
+ * @return\r
+ */\r
+ public static Read<IDiagram> loadDiagram(IProgressMonitor monitor, Resource model, Resource resource, Resource runtime, ResourceArray structuralPath,\r
+ IDiagramLoader loader, IHintObservable initialHints) {\r
+ return new DiagramLoadQuery(monitor, model, resource, runtime, structuralPath, loader, initialHints);\r
+ }\r
+\r
+ /**\r
+ * @param diagram\r
+ * @return\r
+ */\r
+ public static Read<IModelingRules> getModelingRules(final Resource diagram, final IModelingRules defaultValue) {\r
+ return new Read<IModelingRules>() {\r
+ @Override\r
+ public IModelingRules perform(ReadGraph graph) throws DatabaseException {\r
+ StructuralResource2 sr = StructuralResource2.getInstance(graph);\r
+ Resource rules = graph.getPossibleObject(diagram, sr.HasModelingRules);\r
+ if (rules == null)\r
+ return defaultValue;\r
+ return graph.adapt(rules, IModelingRules.class);\r
+ }\r
+ };\r
+ }\r
+\r
+ /**\r
+ * @param connectionType\r
+ * @return\r
+ */\r
+ public static Read<ConnectionVisuals> getConnectionVisuals(Resource connectionType) {\r
+ return new ConnectionVisualsRequest(connectionType);\r
+ }\r
+\r
+ /**\r
+ * @param flag\r
+ * @return\r
+ */\r
+ public static Read<String[]> getFlagText(Resource flag) {\r
+ return new FlagTextQuery(flag);\r
+ }\r
+\r
+ public static Read<Resource> getFlagPair(Resource flag) {\r
+ return new FlagPairQuery(flag);\r
+ }\r
+\r
+ /**\r
+ * @param element\r
+ * @return\r
+ */\r
+ public static Read<TerminalMap> elementTypeTerminals(Resource elementType) {\r
+ return new ResourceRead<TerminalMap>(elementType) {\r
+ @Override\r
+ public TerminalMap perform(ReadGraph graph) throws DatabaseException {\r
+ return DiagramGraphUtil.getElementTypeTerminals(graph, resource);\r
+ }\r
+ };\r
+ }\r
+\r
+ /**\r
+ * @param element\r
+ * @return\r
+ */\r
+ public static Read<TerminalMap> elementTerminals(Resource element) {\r
+ return new ResourceRead<TerminalMap>(element) {\r
+ @Override\r
+ public TerminalMap perform(ReadGraph graph) throws DatabaseException {\r
+ return DiagramGraphUtil.getElementTerminals(graph, resource);\r
+ }\r
+ };\r
+ }\r
+\r
+ /**\r
+ * Browses all diagram connections that are related to {@code connection} by flags.\r
+ * Adds the connections to set {@code conns} and all related connection points to set {@code cps}.\r
+ */\r
+ public static void expandConnections(ReadGraph graph, Resource connection, Set<Resource> conns, Set<IConnectionPoint> cps) throws DatabaseException {\r
+\r
+ if(!conns.add(connection)) return;\r
+\r
+ DiagramResource DIA = DiagramResource.getInstance(graph);\r
+ StructuralResource2 STR = StructuralResource2.getInstance(graph);\r
+\r
+ cps.add(new CPConnection(connection));\r
+ for(Resource connector : graph.getObjects(connection, DIA.HasConnector)) {\r
+ for(Statement stm : graph.getStatements(connector, STR.Connects)) {\r
+ Resource element = stm.getObject();\r
+ if(element.equals(connection)) continue;\r
+ if(graph.isInstanceOf(element, DIA.Flag)) {\r
+ FlagUtil.forCounterparts(graph, element, (otherFlag) -> {\r
+ Resource flagConnector = graph.getPossibleObject(otherFlag, DIA.Flag_ConnectionPoint);\r
+ if(flagConnector != null) {\r
+ Resource otherConnection = graph.getPossibleObject(flagConnector, DIA.IsConnectorOf);\r
+ if(otherConnection != null) {\r
+ expandConnections(graph, otherConnection, conns, cps);\r
+ }\r
+ }\r
+ });\r
+ } else {\r
+ Resource connectionPoint = graph.getInverse(stm.getPredicate());\r
+ //System.err.println("term: " + NameUtils.getSafeName(graph, element) + " : " + NameUtils.getSafeName(graph, connectionPoint));\r
+ cps.add(new CPTerminal(element, connectionPoint));\r
+ }\r
+ }\r
+ }\r
+\r
+ }\r
+ \r
+}\r