From: Tuukka Lehtonen Date: Wed, 11 Sep 2019 21:41:46 +0000 (+0000) Subject: Merge changes I78c3a258,I7bf72f04 X-Git-Tag: v1.43.0~136^2~70 X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=commitdiff_plain;h=b000e272429e157638c0384878b07b8dcd758472;hp=f102c41489c2cbd78116d513cd0e351434bb43eb Merge changes I78c3a258,I7bf72f04 * changes: Handle componentless parent nodes of UCs in synchronization Added logging for history archive import failure cases --- diff --git a/bundles/org.simantics.browsing.ui.graph.impl/src/org/simantics/browsing/ui/graph/impl/EnumerationVariableModifier3.java b/bundles/org.simantics.browsing.ui.graph.impl/src/org/simantics/browsing/ui/graph/impl/EnumerationVariableModifier3.java index 32bd28c17..52b5012d7 100644 --- a/bundles/org.simantics.browsing.ui.graph.impl/src/org/simantics/browsing/ui/graph/impl/EnumerationVariableModifier3.java +++ b/bundles/org.simantics.browsing.ui.graph.impl/src/org/simantics/browsing/ui/graph/impl/EnumerationVariableModifier3.java @@ -13,10 +13,12 @@ package org.simantics.browsing.ui.graph.impl; import java.util.List; +import org.simantics.browsing.ui.common.modifiers.EnumerationValue; import org.simantics.browsing.ui.content.Labeler.EnumerationModifier; import org.simantics.databoard.Bindings; import org.simantics.db.ReadGraph; import org.simantics.db.RequestProcessor; +import org.simantics.db.Resource; import org.simantics.db.Session; import org.simantics.db.VirtualGraph; import org.simantics.db.WriteGraph; @@ -53,6 +55,10 @@ public class EnumerationVariableModifier3 implements EnumerationModifier { return processor.syncRequest(new Read() { @Override public String perform(ReadGraph graph) throws DatabaseException { + EnumerationValue ev = graph.syncRequest(new GetEnumerationValue(variable.getParent(graph).getRepresents(graph))); + if(ev != null) { + return ev.getEnumeratedValue().getName(); + } // System.err.println(variable.getURI(graph)); return variable.getValue(graph);//variable.getPossiblePropertyValue(graph, Variables.LABEL); } diff --git a/bundles/org.simantics.browsing.ui.graph.impl/src/org/simantics/browsing/ui/graph/impl/GetEnumerationValue.java b/bundles/org.simantics.browsing.ui.graph.impl/src/org/simantics/browsing/ui/graph/impl/GetEnumerationValue.java index c246e7bd9..0f9d119ac 100644 --- a/bundles/org.simantics.browsing.ui.graph.impl/src/org/simantics/browsing/ui/graph/impl/GetEnumerationValue.java +++ b/bundles/org.simantics.browsing.ui.graph.impl/src/org/simantics/browsing/ui/graph/impl/GetEnumerationValue.java @@ -42,6 +42,14 @@ public class GetEnumerationValue extends ResourceRead return enumerate(graph, resource); } + public static String getEnumerationValueName(ReadGraph graph, Resource resource) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + String label = graph.getPossibleRelatedValue(resource, L0.HasLabel, Bindings.STRING); + if(label != null) + return label; + return safeName(graph, resource); + } + public static EnumerationValue enumerate(ReadGraph graph, Resource resource) throws DatabaseException { Layer0 l0 = Layer0.getInstance(graph); Set types = graph.getTypes(resource); @@ -61,7 +69,7 @@ public class GetEnumerationValue extends ResourceRead Collection values = graph.getObjects(type, l0.ConsistsOf); List> result = new ArrayList>(values.size()); for (Resource value : values) { - result.add(new EnumeratedValue(safeName(graph, value), value)); + result.add(new EnumeratedValue(getEnumerationValueName(graph, value), value)); } Enumeration enumeration = new Enumeration(result); return new EnumerationValue(enumeration, enumeration.find(resource)); diff --git a/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/QueryCache.java b/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/QueryCache.java index 06882a489..de942b90f 100644 --- a/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/QueryCache.java +++ b/bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/QueryCache.java @@ -19,7 +19,7 @@ import org.simantics.db.request.Read; public class QueryCache extends QueryCacheBase { - private static final boolean SINGLE = false; + private static final boolean SINGLE = true; public QueryCache(QuerySupport querySupport, int threads) { super(querySupport, threads); diff --git a/bundles/org.simantics.desktop.product/splash.svg b/bundles/org.simantics.desktop.product/splash.svg index ff75c9a67..5a0d20984 100644 --- a/bundles/org.simantics.desktop.product/splash.svg +++ b/bundles/org.simantics.desktop.product/splash.svg @@ -401,7 +401,7 @@ id="tspan6235" x="4.0821486" y="291.79337" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444447px;font-family:'The Real Font';-inkscape-font-specification:'The Real Font';fill:#ffffff;fill-opacity:1;stroke-width:0.26458335px">1.40.0 + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444447px;font-family:'The Real Font';-inkscape-font-specification:'The Real Font';fill:#ffffff;fill-opacity:1;stroke-width:0.26458335px">1.41.0 1.0) { + return new Point2D.Double(p2.x, p2.y); + } else if (u <= 0.0) { + return new Point2D.Double(p1.x, p1.y); + } else { + return new Point2D.Double(p2.x * u + p1.x * (1.0-u), (p2.y * u + p1.y * (1.0- u))); + } + } + } public Path2D getPath2D() { Path2D result = new Path2D.Double(); diff --git a/bundles/org.simantics.issues.common/src/org/simantics/issues/common/AllActiveIssues.java b/bundles/org.simantics.issues.common/src/org/simantics/issues/common/AllActiveIssues.java index 006e779d4..1bb292851 100644 --- a/bundles/org.simantics.issues.common/src/org/simantics/issues/common/AllActiveIssues.java +++ b/bundles/org.simantics.issues.common/src/org/simantics/issues/common/AllActiveIssues.java @@ -47,7 +47,7 @@ public class AllActiveIssues extends ResourceRead> { result.addAll(graph.syncRequest(new AllModelIssues(model, false))); } - List libraries = SCLFunctions.evaluateDB("Simantics/SharedOntologies", "getSharedOntologies", Tuple0.INSTANCE); + List libraries = SCLFunctions.evaluateGraph("Simantics/SharedOntologies", "getSharedOntologies", graph, Tuple0.INSTANCE); for (Resource library : libraries) { result.addAll(graph.syncRequest(new AllModelIssues(library, false))); diff --git a/bundles/org.simantics.issues.ui/src/org/simantics/issues/ui/handler/RunActiveValidations.java b/bundles/org.simantics.issues.ui/src/org/simantics/issues/ui/handler/RunActiveValidations.java index efdba04d0..f6121ce19 100644 --- a/bundles/org.simantics.issues.ui/src/org/simantics/issues/ui/handler/RunActiveValidations.java +++ b/bundles/org.simantics.issues.ui/src/org/simantics/issues/ui/handler/RunActiveValidations.java @@ -69,7 +69,7 @@ public class RunActiveValidations extends AbstractHandler { public static void run() throws DatabaseException { Resource model = Simantics.getSession().syncRequest(new PossibleActiveModel(Simantics.getProjectResource())); if(model != null) - run(null); + run(model); } public static void run(Resource model) { diff --git a/bundles/org.simantics.modeling.ontology/graph/ModelingViewpoint.pgraph b/bundles/org.simantics.modeling.ontology/graph/ModelingViewpoint.pgraph index 98b7aa981..b97753e5f 100644 --- a/bundles/org.simantics.modeling.ontology/graph/ModelingViewpoint.pgraph +++ b/bundles/org.simantics.modeling.ontology/graph/ModelingViewpoint.pgraph @@ -457,6 +457,13 @@ MOD.Contributions.ActivateModel : VP.ActionContribution VP.ActionContribution.HasNodeType SIMU.Model VP.ActionContribution.HasAction ACTIONS.ActivateModel +MOD.Contributions.ActivateExperiment : VP.ActionContribution + L0.HasLabel "Activate" + VP.ActionContribution.HasImage SILK.bullet_go + VP.ActionContribution.HasCategory VP.EditActionCategory + VP.ActionContribution.HasNodeType SIMU.Experiment + VP.ActionContribution.HasAction ACTIONS.ActivateExperiment + MOD.Contributions.Help : VP.ActionContribution L0.HasLabel "Help" VP.ActionContribution.HasImage SILK.help @@ -727,6 +734,8 @@ ACTIONS.NewSheetBook @MOD.sclAction "createSpreadsheetBookAction" ACTIONS.ActivateModel @MOD.sclAction "activateModelAction" +ACTIONS.ActivateExperiment + @MOD.sclAction "activateExperimentAction" ACTIONS.MigrateComponentType : ACT.Action ACTIONS.CompilePGraphs : ACT.Action //ACTIONS.MigrateMasterTypical : ACT.Action diff --git a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/componentTypeEditor/ComponentTypeViewer.java b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/componentTypeEditor/ComponentTypeViewer.java index 75c60d24c..38f24b4f7 100644 --- a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/componentTypeEditor/ComponentTypeViewer.java +++ b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/componentTypeEditor/ComponentTypeViewer.java @@ -34,6 +34,7 @@ import org.osgi.framework.BundleContext; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; import org.simantics.Simantics; +import org.simantics.browsing.ui.graph.impl.GetEnumerationValue; import org.simantics.databoard.Bindings; import org.simantics.databoard.binding.Binding; import org.simantics.databoard.binding.error.BindingException; @@ -42,6 +43,7 @@ import org.simantics.databoard.type.NumberType; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.common.NamedResource; +import org.simantics.db.common.request.IsEnumeratedValue; import org.simantics.db.common.request.UniqueRead; import org.simantics.db.common.utils.NameUtils; import org.simantics.db.exception.DatabaseException; @@ -201,6 +203,8 @@ public class ComponentTypeViewer { expression = graph.getPossibleRelatedValue(assertion, L0.SCLValue_expression, Bindings.STRING); if(expression != null) { defaultValue = "=" + expression; //$NON-NLS-1$ + } else if (graph.sync(new IsEnumeratedValue(assertion))) { + defaultValue = GetEnumerationValue.getEnumerationValueName(graph, assertion); } else { Datatype dt = getPossibleDatatype(graph, assertion); if (dt == null) diff --git a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/componentTypeEditor/ComponentTypeViewerData.java b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/componentTypeEditor/ComponentTypeViewerData.java index ea10d6d8d..01c799d45 100644 --- a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/componentTypeEditor/ComponentTypeViewerData.java +++ b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/componentTypeEditor/ComponentTypeViewerData.java @@ -1,8 +1,11 @@ package org.simantics.modeling.ui.componentTypeEditor; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; @@ -33,6 +36,7 @@ import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.widgets.Form; import org.eclipse.ui.forms.widgets.FormToolkit; import org.simantics.Simantics; +import org.simantics.databoard.Bindings; import org.simantics.databoard.type.NumberType; import org.simantics.databoard.units.internal.library.UnitLibrary; import org.simantics.databoard.util.Limit; @@ -40,15 +44,20 @@ import org.simantics.databoard.util.Range; import org.simantics.databoard.util.RangeException; import org.simantics.db.RequestProcessor; import org.simantics.db.Resource; +import org.simantics.db.Statement; import org.simantics.db.WriteGraph; import org.simantics.db.common.NamedResource; +import org.simantics.db.common.request.IndexRoot; import org.simantics.db.common.request.WriteRequest; import org.simantics.db.exception.DatabaseException; import org.simantics.db.function.DbConsumer; +import org.simantics.db.layer0.QueryIndexUtils; +import org.simantics.db.layer0.util.Layer0Utils; import org.simantics.layer0.Layer0; import org.simantics.modeling.userComponent.ComponentTypeCommands; import org.simantics.scl.runtime.function.Function2; import org.simantics.scl.runtime.function.Function4; +import org.simantics.utils.datastructures.Pair; import org.simantics.utils.threads.ThreadUtils; import org.simantics.utils.ui.ErrorLogger; @@ -246,12 +255,47 @@ public class ComponentTypeViewerData { if (propertyInfo.immutable) return; + Simantics.getSession().async(new WriteRequest() { @Override public void perform(WriteGraph graph) throws DatabaseException { graph.markUndoPoint(); - ComponentTypeCommands.editType(graph, componentType, propertyInfo.resource, convertDefaultValue, newValue); + + String newValue2 = newValue; + + Resource possibleGraphType = null; + Resource root = graph.syncRequest(new IndexRoot(componentType)); + + Resource L0Res = graph.getResource("http://www.simantics.org/Layer0-1.1"); + Layer0 L0 = Layer0.getInstance(graph); + + Collection graphTypes1 = QueryIndexUtils.searchByTypeAndName(graph, L0Res, L0.ValueType, newValue); + Collection graphTypes2 = QueryIndexUtils.searchByTypeAndName(graph, root, L0.ValueType, newValue); + + Collection graphTypes = new HashSet<>(graphTypes1); + graphTypes.addAll(graphTypes2); + + Set> candidates = new HashSet<>(); + for (Resource graphType : graphTypes) { + Collection stms = graph.getAssertedStatements(graphType, L0.HasValueType); + if(stms.size() == 1) { + // Only accept valueType if it asserts HasValueType with the same name + String hasValueType = graph.getValue(stms.iterator().next().getObject(), Bindings.STRING); + if (hasValueType.equals(newValue)) { + candidates.add(new Pair<>(graphType, hasValueType)); + } + } + } + + // We support only graph types with unique name at this point. Later we could implement UI to let the user to select from multiple graph types. + if (candidates.size() == 1) { + Pair result = candidates.iterator().next(); + possibleGraphType = result.first; + newValue2 = result.second; + } + + ComponentTypeCommands.editType(graph, componentType, propertyInfo.resource, convertDefaultValue, newValue2, possibleGraphType); if (range != null) ComponentTypeCommands.setRange(graph, componentType, propertyInfo.resource, range); } }); diff --git a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagram/style/IssueDecorationStyle.java b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagram/style/IssueDecorationStyle.java index d473ff46d..68210f9e2 100644 --- a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagram/style/IssueDecorationStyle.java +++ b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagram/style/IssueDecorationStyle.java @@ -12,9 +12,12 @@ package org.simantics.modeling.ui.diagram.style; import java.awt.geom.AffineTransform; +import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -25,9 +28,13 @@ import org.simantics.db.common.procedure.adapter.TransientCacheListener; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.variable.Variable; import org.simantics.db.layer0.variable.Variables; +import org.simantics.diagram.connection.RouteGraph; import org.simantics.diagram.elements.DecorationSVGNode; import org.simantics.diagram.elements.SVGNode; +import org.simantics.diagram.handler.Paster; +import org.simantics.diagram.handler.Paster.RouteLine; import org.simantics.diagram.profile.StyleBase; +import org.simantics.diagram.stubs.DiagramResource; import org.simantics.diagram.synchronization.graph.DiagramGraphUtil; import org.simantics.issues.Severity; import org.simantics.issues.common.IssueResourcesContexts; @@ -36,10 +43,13 @@ import org.simantics.modeling.ModelingResources; import org.simantics.modeling.ui.Activator; import org.simantics.modeling.ui.diagram.style.IssueDecorationStyle.IssueResult; import org.simantics.scenegraph.INode; +import org.simantics.scenegraph.g2d.nodes.ConnectionNode; import org.simantics.scenegraph.g2d.nodes.Decoration; +import org.simantics.scenegraph.g2d.nodes.connection.RouteGraphNode; import org.simantics.scenegraph.profile.EvaluationContext; import org.simantics.scenegraph.profile.common.ProfileVariables; import org.simantics.scenegraph.utils.NodeUtil; +import org.simantics.structural.stubs.StructuralResource2; import org.simantics.utils.datastructures.map.Tuple; @@ -74,7 +84,6 @@ public class IssueDecorationStyle extends StyleBase { return null; List contexts = getContexts(graph, element); - AffineTransform transform = DiagramGraphUtil.getAffineTransform(graph, element); Map> issuesBySeverity = graph.syncRequest(new ListModelIssuesBySeverity(model, true, true, Severity.NOTE), TransientCacheListener.>>instance()); @@ -82,14 +91,43 @@ public class IssueDecorationStyle extends StyleBase { List issues = issuesBySeverity.get(severity); if (issues != null) { Set issueContexts = graph.syncRequest(new IssueResourcesContexts(issues)); - if (!Collections.disjoint(issueContexts, contexts)) - return new IssueResult(severity, transform); + if (!Collections.disjoint(issueContexts, contexts)) { + return new IssueResult(severity, getIdentifier(graph, runtimeDiagram, element)); + } } } return null; } + private static Object getIdentifier(ReadGraph graph, Resource runtimeDiagram, Resource element) throws DatabaseException { + DiagramResource DIA = DiagramResource.getInstance(graph); + StructuralResource2 STR = StructuralResource2.getInstance(graph); + if (graph.isInstanceOf(element, DIA.RouteGraphConnection)) { + Collection connectors = graph.getObjects(element, DIA.HasConnector); + Collection routeNodes = graph.getObjects(element, DIA.HasInteriorRouteNode); + + // This is needed to make this query result change every time the underlying element changes visually. + Set identifier = new HashSet(connectors.size() + routeNodes.size()); + + for (Resource connector : connectors) { + for (Resource connectedTo : graph.getObjects(connector, STR.Connects)) { + if (!connectedTo.equals(element)) { + AffineTransform at = DiagramGraphUtil.getDynamicAffineTransform(graph, runtimeDiagram, connectedTo, DIA.HasDynamicTransform, false); + identifier.add(at); + } + } + } + for (Resource routeLine : routeNodes) { + RouteLine rl = Paster.readRouteLine(graph, routeLine); + identifier.add(rl); + } + return identifier; + } else { + return DiagramGraphUtil.getAffineTransform(graph, element); + } + } + @Override public void applyStyleForNode(EvaluationContext observer, INode node, IssueResult result) { if (result == null) { @@ -117,6 +155,18 @@ public class IssueDecorationStyle extends StyleBase { protected AffineTransform getDecorationPosition(INode node) { Rectangle2D bounds = NodeUtil.getLocalBounds(node, Decoration.class); + if (node instanceof ConnectionNode) { + for (INode child : ((ConnectionNode)node).getSortedNodes()) { + if (child instanceof RouteGraphNode) { + RouteGraphNode rgn = (RouteGraphNode) child; + RouteGraph rg = rgn.getRouteGraph(); + Point2D nearest = rg.findNearestPoint(bounds.getCenterX(), bounds.getCenterY()); + if (nearest != null) { + return AffineTransform.getTranslateInstance(nearest.getX(), nearest.getY()); + } + } + } + } double tx = bounds.getX(); double ty = bounds.getY(); return AffineTransform.getTranslateInstance(tx, ty); @@ -148,8 +198,8 @@ public class IssueDecorationStyle extends StyleBase { * element moves. */ public static class IssueResult extends Tuple { - public IssueResult(Severity severity, AffineTransform transform) { - super(severity, transform); + public IssueResult(Severity severity, Object identifier) { + super(severity, identifier); } public Severity getSeverity() { return (Severity) getField(0); diff --git a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/OpenDiagramFromComponentAdapter.java b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/OpenDiagramFromComponentAdapter.java index d5071303e..6be9f72f9 100644 --- a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/OpenDiagramFromComponentAdapter.java +++ b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/OpenDiagramFromComponentAdapter.java @@ -63,6 +63,15 @@ public class OpenDiagramFromComponentAdapter extends AbstractResourceEditorAdapt super(Messages.OpenDiagramFromComponentAdapter_OpenDiagramContainingComponent, Activator.SYMBOL_ICON); } + protected String getEditorId(ReadGraph g, Resource diagram) throws DatabaseException { + ModelingResources MOD = ModelingResources.getInstance(g); + String preferredEditorId = g.getPossibleRelatedValue(diagram, MOD.PreferredDiagramEditorID); + if(preferredEditorId != null) + return preferredEditorId; + else + return EDITOR_ID; + } + @Override public boolean canHandle(ReadGraph graph, Object input) throws DatabaseException { Pair p = tryGetResource(graph, input); @@ -153,6 +162,8 @@ public class OpenDiagramFromComponentAdapter extends AbstractResourceEditorAdapt Resource composite = g.getSingleObject(component, l0.PartOf); Resource diagram = ComponentUtils.getPossibleCompositeDiagram(g, composite); + String editorId = getEditorId(g, composite); + if (LOGGER.isDebugEnabled()) { LOGGER.debug(getClass().getSimpleName() + ".findDiagram: component: " + NameUtils.getURIOrSafeNameInternal(g, component)); //$NON-NLS-1$ LOGGER.debug(getClass().getSimpleName() + ".findDiagram: composite: " + NameUtils.getURIOrSafeNameInternal(g, composite)); //$NON-NLS-1$ @@ -213,7 +224,7 @@ public class OpenDiagramFromComponentAdapter extends AbstractResourceEditorAdapt // Prevent diagram from opening if there's nothing to select // on the diagram based on the received input. if (!selectedObjects.isEmpty()) - result.add( NavigateToTarget.editorActivator(EDITOR_ID, diagram, indexRoot, rvi, editorActivationCallback(selectedObjects)) ); + result.add( NavigateToTarget.editorActivator(editorId, diagram, indexRoot, rvi, editorActivationCallback(selectedObjects)) ); } else { final MapSet referencingDiagrams = listReferenceDiagrams(g, referenceElements); final Set diagrams = referencingDiagrams.getKeys(); @@ -238,7 +249,7 @@ public class OpenDiagramFromComponentAdapter extends AbstractResourceEditorAdapt RVI rvi = getDiagramCompositeRvi(g, singleDiagram.getResource()); if (rvi != null) { Collection selectedObjects = referencingDiagrams.getValues(singleDiagram); - result.add( NavigateToTarget.editorActivator(EDITOR_ID, singleDiagram.getResource(), indexRoot, rvi, editorActivationCallback(selectedObjects)) ); + result.add( NavigateToTarget.editorActivator(editorId, singleDiagram.getResource(), indexRoot, rvi, editorActivationCallback(selectedObjects)) ); } break; @@ -254,7 +265,7 @@ public class OpenDiagramFromComponentAdapter extends AbstractResourceEditorAdapt if (selected != null) { Collection selectedObjects = referencingDiagrams.getValues(selected); RVI drvi = diagramToRvi.get(selected); - NavigateToTarget.editorActivator(EDITOR_ID, selected.getResource(), indexRoot, drvi, editorActivationCallback(selectedObjects)).run(); + NavigateToTarget.editorActivator(editorId, selected.getResource(), indexRoot, drvi, editorActivationCallback(selectedObjects)).run(); } }); break; diff --git a/bundles/org.simantics.modeling/scl/Simantics/Simulation.scl b/bundles/org.simantics.modeling/scl/Simantics/Simulation.scl index 2a721ee21..e61b161ad 100644 --- a/bundles/org.simantics.modeling/scl/Simantics/Simulation.scl +++ b/bundles/org.simantics.modeling/scl/Simantics/Simulation.scl @@ -13,6 +13,11 @@ importJava "org.simantics.simulation.experiment.ExperimentUtil" where createExperimentRun :: Resource -> Resource createExperimentRunWithType :: Resource -> Resource -> Resource activateRun :: Resource -> () + +activateExperimentAction :: Resource -> () +activateExperimentAction experiment = do + syncWrite (\() -> activateExperiment experiment) + () importJava "org.simantics.simulation.experiment.IExperiment" where data IExperiment diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/SCLScenegraph.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/SCLScenegraph.java index 40a526585..fad803ce4 100644 --- a/bundles/org.simantics.modeling/src/org/simantics/modeling/SCLScenegraph.java +++ b/bundles/org.simantics.modeling/src/org/simantics/modeling/SCLScenegraph.java @@ -85,6 +85,7 @@ import org.slf4j.LoggerFactory; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.Element; +import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class SCLScenegraph { @@ -916,10 +917,21 @@ public class SCLScenegraph { } else if (!(node instanceof RouteGraphNode) && !(node instanceof LinkNode)){ try { Element doc = renderSVGNode(svgGenerator, (IG2DNode)node); - if (doc.getElementsByTagName("g").getLength() == 0) + NodeList gList = doc.getElementsByTagName("g"); + if (gList.getLength() == 0) return; + boolean hasContent = false; + for (int i = 0; i < gList.getLength(); i++) { + Node gNode = gList.item(i); + if (gNode.hasChildNodes()) { + hasContent = true; + break; + } + } + if (!hasContent) + return; String svg = printSVGDocument(doc); - parentBuilder.append(MAIN_SECTION, ""); + parentBuilder.append(MAIN_SECTION, ""); parentBuilder.append(MAIN_SECTION, svg); parentBuilder.append(MAIN_SECTION, "\n"); } catch (Exception e) { diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/rules/MappedModelingRules.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/rules/MappedModelingRules.java index 21a435f4a..99e864861 100644 --- a/bundles/org.simantics.modeling/src/org/simantics/modeling/rules/MappedModelingRules.java +++ b/bundles/org.simantics.modeling/src/org/simantics/modeling/rules/MappedModelingRules.java @@ -158,7 +158,7 @@ public class MappedModelingRules extends AbstractModelingRules { // This is a lifted flag in a structural configuration. mappedConnectionPoints.add(new CPTerminal(terminal.component, isLiftedAs)); } else { - // Do nothing, because the flag is not connected + mappedConnectionPoints.add(terminal); } } } else if (cp instanceof CPConnection) { diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/userComponent/ComponentTypeCommands.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/userComponent/ComponentTypeCommands.java index 74ae599e3..9cf93fac5 100644 --- a/bundles/org.simantics.modeling/src/org/simantics/modeling/userComponent/ComponentTypeCommands.java +++ b/bundles/org.simantics.modeling/src/org/simantics/modeling/userComponent/ComponentTypeCommands.java @@ -11,6 +11,7 @@ *******************************************************************************/ package org.simantics.modeling.userComponent; +import java.util.Collections; import java.util.Map; import org.simantics.databoard.Bindings; @@ -27,11 +28,13 @@ import org.simantics.db.Resource; import org.simantics.db.Statement; import org.simantics.db.WriteGraph; import org.simantics.db.common.CommentMetadata; +import org.simantics.db.common.request.EnumerationMap; +import org.simantics.db.common.request.IsEnumeratedValue; import org.simantics.db.common.request.UnaryRead; import org.simantics.db.common.utils.NameUtils; import org.simantics.db.exception.DatabaseException; import org.simantics.db.exception.ServiceException; -import org.simantics.db.layer0.request.ModelInstances; +import org.simantics.db.layer0.QueryIndexUtils; import org.simantics.db.layer0.util.Layer0Utils; import org.simantics.layer0.Layer0; import org.simantics.modeling.ModelingResources; @@ -42,6 +45,7 @@ import org.simantics.scl.runtime.tuple.Tuple3; import org.simantics.selectionview.SelectionViewResources; import org.simantics.structural.stubs.StructuralResource2; import org.simantics.structural2.utils.StructuralUtils; +import org.simantics.utils.strings.AlphanumComparator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -199,6 +203,11 @@ public class ComponentTypeCommands { public static void setRequiredType(WriteGraph g, Resource componentType, Resource property, String requiredType) throws DatabaseException { + setRequiredType(g, componentType, property, requiredType, null); + } + + public static void setRequiredType(WriteGraph g, Resource componentType, Resource property, + String requiredType, Resource possibleType) throws DatabaseException { Layer0 L0 = Layer0.getInstance(g); g.claimLiteral(property, L0.RequiresValueType, requiredType); @@ -211,17 +220,34 @@ public class ComponentTypeCommands { } } + // We assert the range of the property only if we are given a dedicated graph value type + if(g.hasStatement(property, L0.HasRange)) + g.deny(property, L0.HasRange); + + if(possibleType != null) { + // We have a dedicated graph type for this SCL value type + if(g.hasStatement(possibleType, L0.Enumeration)) { + // This value type is an enumeration - let's constrain the range of this predicate to match the enumeration type only + g.claim(property, L0.HasRange, possibleType); + } + } + CommentMetadata cm = g.getMetadata(CommentMetadata.class); g.addMetadata(cm.add("Set required type "+ requiredType + " for component/annotation " + property)); } public static void editType(WriteGraph graph, Resource componentType, Resource property, boolean convertDefaultValue, String newValue) throws DatabaseException { - ComponentTypeCommands.setRequiredType(graph, componentType, property, newValue); + editType(graph, componentType, property, convertDefaultValue, newValue, null); + } + + public static void editType(WriteGraph graph, Resource componentType, Resource property, boolean convertDefaultValue, String newValue, Resource possibleType) throws DatabaseException { + ComponentTypeCommands.setRequiredType(graph, componentType, property, newValue, possibleType); if (convertDefaultValue) { - ComponentTypeCommands.convertDefaultValue(graph, componentType, property, newValue); - Map instances = graph.sync(new ModelInstances(componentType, componentType)); - for(Resource instance : instances.values()) { - ComponentTypeCommands.convertInstantiatedValue(graph, instance, property, newValue); + ComponentTypeCommands.convertDefaultValue(graph, componentType, property, newValue, possibleType); + for (Resource indexRoot : Layer0Utils.listIndexRoots(graph)) { + for(Resource instance : QueryIndexUtils.searchByTypeShallow(graph, indexRoot, componentType)) { + ComponentTypeCommands.convertInstantiatedValue(graph, instance, property, newValue, componentType); + } } } } @@ -270,11 +296,29 @@ public class ComponentTypeCommands { " in " + NameUtils.getSafeName(g, type) + "."); return; } + + Layer0 L0 = Layer0.getInstance(g); + Resource range = g.getPossibleObject(relation, L0.HasRange); + if (range != null) { + if(g.hasStatement(range, L0.Enumeration)) { + Map values = g.syncRequest(new EnumerationMap(range)); + Resource value = values.get(valueText); + if (value != null) { + for(Resource assertion : g.getObjects(type, L0.Asserts)) { + Resource p = g.getSingleObject(assertion, L0.HasPredicate); + if (p.equals(relation)) { + g.deny(assertion, L0.HasObject, object); + g.claim(assertion, L0.HasObject, value); + } + } + } + return; + } + } if(valueText.length() > 0 && valueText.charAt(0) == '=') { String expression = valueText.substring(1); - Layer0 L0 = Layer0.getInstance(g); ModelingResources MOD = ModelingResources.getInstance(g); if(!g.isInstanceOf(object, MOD.SCLValue)) { Resource assertion = g.getSingleObject(object, L0.HasObjectInverse); @@ -288,7 +332,6 @@ public class ComponentTypeCommands { } else { - Layer0 L0 = Layer0.getInstance(g); ModelingResources MOD = ModelingResources.getInstance(g); if(g.isInstanceOf(object, MOD.SCLValue)) { Resource assertion = g.getSingleObject(object, L0.HasObjectInverse); @@ -421,6 +464,22 @@ public class ComponentTypeCommands { public static void convertDefaultValue(WriteGraph g, Resource type, Resource relation, String newSCLType) throws DatabaseException { + convertDefaultValue(g, type, relation, newSCLType, null); + } + + private static Resource findAssertionWithPO(ReadGraph graph, Resource possibleType, Resource predicate, Resource object) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + for(Resource assertion : graph.getObjects(possibleType, L0.Asserts)) { + Resource p = graph.getSingleObject(assertion, L0.HasPredicate); + Resource o = graph.getSingleObject(assertion, L0.HasObject); + if(predicate.equals(p) && object.equals(o)) + return assertion; + } + return null; + } + + public static void convertDefaultValue(WriteGraph g, + Resource type, Resource relation, String newSCLType, Resource possibleType) throws DatabaseException { Resource object = getAssertedObject(g, type, relation); if(object == null) { LOGGER.warn("Didn't find assertion for " + NameUtils.getSafeName(g, relation) + @@ -428,27 +487,72 @@ public class ComponentTypeCommands { return; } + Layer0 L0 = Layer0.getInstance(g); + if(possibleType != null) { + if(g.hasStatement(possibleType, L0.Enumeration)) { + if(!g.isInstanceOf(object, possibleType)) { + Map enumMap = g.syncRequest(new EnumerationMap(possibleType)); + String firstKey = Collections.min(enumMap.keySet(), AlphanumComparator.COMPARATOR); + Resource defaultValue = enumMap.get(firstKey); + + if (defaultValue != null) { + Resource assertion = findAssertionWithPO(g, type, relation, object); + if(assertion != null) { + g.deny(assertion, L0.HasObject); + g.claim(assertion, L0.HasObject, defaultValue); + return; + } else { + Layer0Utils.assert_(g, type, relation, defaultValue); + return; + } + } + } else { + return; + } + } + } + Tuple tuple = getDatatypeValueAndBinding(g, object, newSCLType); if (tuple == null) return; - Layer0 L0 = Layer0.getInstance(g); + if(g.sync(new IsEnumeratedValue(object))) { + Resource assertion = findAssertionWithPO(g, type, relation, object); + object = g.newResource(); + g.claim(object, L0.InstanceOf, L0.Literal); + if(assertion != null) { + g.deny(assertion, L0.HasObject); + g.claim(assertion, L0.HasObject, object); + } + } + g.claimLiteral(object, L0.HasDataType, L0.DataType, tuple.get(0), Bindings.getBindingUnchecked(Datatype.class)); g.claimLiteral(object, L0.HasValueType, g.getRelatedValue(relation, L0.RequiresValueType, Bindings.STRING), Bindings.STRING); g.claimValue(object, tuple.get(1), (Binding)tuple.get(2)); } - public static void convertInstantiatedValue(WriteGraph g, Resource instance, Resource relation, String newSCLType) + public static void convertInstantiatedValue(WriteGraph g, Resource instance, Resource relation, String newSCLType) throws DatabaseException { + convertInstantiatedValue(g, instance, relation, newSCLType, null); + } + + public static void convertInstantiatedValue(WriteGraph g, Resource instance, Resource relation, String newSCLType, Resource possibleType) throws DatabaseException { Statement stm = g.getPossibleStatement(instance, relation); if(stm != null && !stm.isAsserted(instance)) { + Layer0 L0 = Layer0.getInstance(g); Resource object = stm.getObject(); + if(g.sync(new IsEnumeratedValue(object))) { + if(!g.isInstanceOf(object, possibleType)) { + g.deny(instance, relation); + } + return; + } + // We can only convert literals - Layer0 L0 = Layer0.getInstance(g); if(!g.isInstanceOf(object, L0.Literal)) return; Tuple tuple = getDatatypeValueAndBinding(g, object, newSCLType); diff --git a/bundles/org.simantics.scenegraph.profile/src/org/simantics/scenegraph/profile/common/ObserverGroupListener.java b/bundles/org.simantics.scenegraph.profile/src/org/simantics/scenegraph/profile/common/ObserverGroupListener.java index 497b401a2..31295b9b6 100644 --- a/bundles/org.simantics.scenegraph.profile/src/org/simantics/scenegraph/profile/common/ObserverGroupListener.java +++ b/bundles/org.simantics.scenegraph.profile/src/org/simantics/scenegraph/profile/common/ObserverGroupListener.java @@ -66,7 +66,7 @@ public class ObserverGroupListener implements SetListener { return true; else if (object == null) return false; - else if (ObserverGroupListener.class != object.getClass()) + else if (getClass() != object.getClass()) return false; ObserverGroupListener other = (ObserverGroupListener)object; return observer.equals(other.observer) && group.equals(other.group) && style.equals(other.style); diff --git a/bundles/org.simantics.scl.db/src/org/simantics/scl/db/SCLFunctions.java b/bundles/org.simantics.scl.db/src/org/simantics/scl/db/SCLFunctions.java index d8f83e05f..09022d543 100644 --- a/bundles/org.simantics.scl.db/src/org/simantics/scl/db/SCLFunctions.java +++ b/bundles/org.simantics.scl.db/src/org/simantics/scl/db/SCLFunctions.java @@ -123,7 +123,7 @@ public class SCLFunctions { } private static T evaluate(RuntimeModule rm, String function, Object ... args) throws ValueNotFound { - return evaluate(resolveFunction(rm, function)); + return evaluate(resolveFunction(rm, function), args); } public static T evaluate(String module, String function, Object ... args) throws ValueNotFound { @@ -151,7 +151,7 @@ public class SCLFunctions { } } - public static T evaluateGraph(String module, String function, Object graph, Object ... args) throws DatabaseException { + public static T evaluateGraph(String module, String function, ReadGraph graph, Object ... args) throws DatabaseException { final SCLContext context = SCLContext.getCurrent(); SCLContext.push(context); Object oldGraph = context.put(GRAPH, graph); @@ -163,7 +163,7 @@ public class SCLFunctions { } } - public static void runWithGraph(Object graph, Runnable r) { + public static void runWithGraph(ReadGraph graph, Runnable r) { final SCLContext context = SCLContext.getCurrent(); SCLContext.push(context); Object oldGraph = context.put(GRAPH, graph); diff --git a/bundles/org.simantics.selectionview/src/org/simantics/selectionview/function/All.java b/bundles/org.simantics.selectionview/src/org/simantics/selectionview/function/All.java index 79541b061..d26d86682 100644 --- a/bundles/org.simantics.selectionview/src/org/simantics/selectionview/function/All.java +++ b/bundles/org.simantics.selectionview/src/org/simantics/selectionview/function/All.java @@ -2,6 +2,7 @@ package org.simantics.selectionview.function; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.Map; import java.util.function.Consumer; @@ -13,6 +14,7 @@ import org.eclipse.swt.widgets.FontDialog; import org.simantics.Simantics; import org.simantics.browsing.ui.NodeContext; import org.simantics.browsing.ui.content.Labeler.DialogModifier; +import org.simantics.browsing.ui.graph.impl.GetEnumerationValue; import org.simantics.common.format.Formatter; import org.simantics.databoard.Bindings; import org.simantics.databoard.Datatypes; @@ -62,6 +64,7 @@ import org.simantics.ui.fonts.Fonts; import org.simantics.ui.selection.WorkbenchSelectionElement; import org.simantics.ui.selection.WorkbenchSelectionUtils; import org.simantics.utils.datastructures.collections.CollectionUtils; +import org.simantics.utils.strings.AlphanumComparator; import org.simantics.utils.ui.AdaptionUtils; import org.simantics.utils.ui.ErrorLogger; import org.simantics.utils.ui.ISelectionUtils; @@ -198,7 +201,9 @@ public class All { Resource parameterResource = parameter.getRepresents(graph); if(graph.sync(new IsEnumeratedValue(parameterResource))) { Map map = graph.sync(new InstanceEnumerationMap(parameterResource)); - return new ArrayList(map.keySet()); + ArrayList values = new ArrayList<>(map.keySet()); + Collections.sort(values, AlphanumComparator.COMPARATOR); + return values; } else if(graph.isInstanceOf(parameterResource, L0.Boolean)) { return CollectionUtils.toList("true", "false"); } @@ -463,6 +468,14 @@ public class All { value = formatterFunction.apply(property.getValue(graph)); } } + + Resource possibleValue = context.getParent(graph).getPossibleRepresents(graph); + if(possibleValue != null) { + if(graph.syncRequest(new IsEnumeratedValue(possibleValue))) { + return GetEnumerationValue.getEnumerationValueName(graph, possibleValue); + } + } + if(value == null) { Variant variant = property.getVariantValue(graph); @@ -518,8 +531,14 @@ public class All { String parsedLabel = (String)_value; Object value = parsedLabel; + boolean isEnumeration = false; + Resource possibleValue = context.getParent(graph).getPossibleRepresents(graph); + if(possibleValue != null) { + isEnumeration = graph.syncRequest(new IsEnumeratedValue(possibleValue)); + } + Datatype type = context.getParent(graph).getPossibleDatatype(graph); - if (type != null) { + if (type != null && !isEnumeration) { Binding binding = Bindings.getBinding(type); diff --git a/features/org.simantics.sdk.feature/feature.xml b/features/org.simantics.sdk.feature/feature.xml index c0cedff2f..000f176e9 100644 --- a/features/org.simantics.sdk.feature/feature.xml +++ b/features/org.simantics.sdk.feature/feature.xml @@ -13,7 +13,7 @@ diff --git a/releng/org.simantics.sdk.build.targetdefinition/simantics.target b/releng/org.simantics.sdk.build.targetdefinition/simantics.target index ec1814d1d..58faa0f92 100644 --- a/releng/org.simantics.sdk.build.targetdefinition/simantics.target +++ b/releng/org.simantics.sdk.build.targetdefinition/simantics.target @@ -1,7 +1,7 @@ - + diff --git a/releng/org.simantics.sdk.build.targetdefinition/simantics.tpd b/releng/org.simantics.sdk.build.targetdefinition/simantics.tpd index eeb2e54b8..9c1709414 100644 --- a/releng/org.simantics.sdk.build.targetdefinition/simantics.tpd +++ b/releng/org.simantics.sdk.build.targetdefinition/simantics.tpd @@ -1,4 +1,4 @@ -target "Simantics 1.40.0" +target "Simantics 1.41.0" with source allEnvironments diff --git a/releng/org.simantics.sdk.repository/pom.xml b/releng/org.simantics.sdk.repository/pom.xml index 4902ca06d..8aa8e170b 100644 --- a/releng/org.simantics.sdk.repository/pom.xml +++ b/releng/org.simantics.sdk.repository/pom.xml @@ -2,7 +2,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.simantics.sdk.repository - 1.40.0-SNAPSHOT + 1.41.0-SNAPSHOT eclipse-repository