From b9d42db02ee4126eb302518a05ff42f471b14954 Mon Sep 17 00:00:00 2001 From: jkauttio Date: Thu, 17 Apr 2014 11:55:12 +0000 Subject: [PATCH] Merge changes from trunk refs #2924 git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/branches/dev-jkauttio@29301 ac1ea38d-2e2b-0410-8846-a27921b304fc --- .../META-INF/MANIFEST.MF | 3 +- .../fi/semantum/sysdyn/solver/Addition.java | 7 + .../src/fi/semantum/sysdyn/solver/And.java | 8 + .../semantum/sysdyn/solver/Application.java | 9 + .../fi/semantum/sysdyn/solver/Argument.java | 8 + .../src/fi/semantum/sysdyn/solver/Array.java | 12 + .../sysdyn/solver/ArraySliceExpression.java | 9 + .../fi/semantum/sysdyn/solver/Assignment.java | 2 +- .../fi/semantum/sysdyn/solver/Constant.java | 7 + .../semantum/sysdyn/solver/Declaration.java | 8 + .../fi/semantum/sysdyn/solver/Derivate.java | 14 +- .../fi/semantum/sysdyn/solver/Derivative.java | 5 + .../fi/semantum/sysdyn/solver/Division.java | 9 + .../sysdyn/solver/ElementwiseProduct.java | 9 + .../src/fi/semantum/sysdyn/solver/Equals.java | 9 + .../fi/semantum/sysdyn/solver/ForArray.java | 13 + .../sysdyn/solver/GreaterOrEqualThan.java | 9 + .../semantum/sysdyn/solver/GreaterThan.java | 9 + .../semantum/sysdyn/solver/IExpression.java | 5 + .../fi/semantum/sysdyn/solver/IfThenElse.java | 10 + .../sysdyn/solver/LessOrEqualThan.java | 9 + .../fi/semantum/sysdyn/solver/LessThan.java | 9 + .../sysdyn/solver/Multiplication.java | 9 + .../fi/semantum/sysdyn/solver/Negation.java | 8 + .../fi/semantum/sysdyn/solver/NotEquals.java | 9 + .../sysdyn/solver/NullModification.java | 5 + .../src/fi/semantum/sysdyn/solver/Or.java | 8 + .../sysdyn/solver/ParameterDeclaration.java | 5 + .../src/fi/semantum/sysdyn/solver/Solver.java | 84 +++- .../semantum/sysdyn/solver/Subtraction.java | 9 + .../semantum/sysdyn/solver/TimeVariable.java | 7 + .../fi/semantum/sysdyn/solver/Variable.java | 7 + .../semantum/sysdyn/solver/VariableBase.java | 2 - .../sysdyn/solver/VariableDeclaration.java | 7 + .../sysdyn/solver/parser/ModelParser.java | 42 +- .../solver/parser/ModelParserConstants.java | 7 +- .../parser/ModelParserTokenManager.java | 367 +++++++++++------- .../sysdyn/solver/parser/ModelicaParser.jj | 7 +- .../sysdyn/solver/parser/ModelicaParser.jjt | 7 +- .../chart/properties/AdjustableTab.java | 16 +- .../LabelPropertyTabContributor.java | 66 +--- .../chart/properties/bar/BarAxisTab.java | 1 - .../bar/BarGeneralPropertiesTab.java | 1 - .../chart/properties/bar/BarSeriesTab.java | 1 - .../pie/PieGeneralPropertiesTab.java | 1 - .../chart/properties/pie/PieSeriesTab.java | 1 - .../xyline/XYLineAxisAndVariablesTab.java | 1 - .../xyline/XYLineGeneralPropertiesTab.java | 1 - ...s Environments And Hotel Facilities.sysdyn | Bin 74715 -> 74492 bytes org.simantics.sysdyn.ontology/graph.tg | Bin 175973 -> 182186 bytes .../graph/Migration.pgraph | 46 ++- .../graph/Sysdyn.pgraph | 8 +- .../org/simantics/sysdyn/SysdynResource.java | 12 + org.simantics.sysdyn.ui/plugin.xml | 42 +- .../ui/browser/contributions/Model.java | 2 +- .../sysdyn/ui/elements/LoopFactory.java | 6 +- .../ui/properties/ArrayDependencyTab.java | 211 ++++++---- .../sysdyn/ui/properties/CommentTab.java | 9 +- .../ui/properties/ConfigurationTab.java | 9 +- .../sysdyn/ui/properties/DependencyTab.java | 1 - .../sysdyn/ui/properties/EquationTab.java | 1 - .../sysdyn/ui/properties/FunctionTab.java | 1 - .../sysdyn/ui/properties/LoopTab.java | 2 +- .../ResourceSelectionProcessor.java | 6 + .../SensitivityAnalysisExperimentTab.java | 1 - .../ui/properties/VariableInformationTab.java | 1 - .../properties/widgets/CustomFontDialog.java | 18 + .../SensitivityChartAxisAndVariablesTab.java | 6 - .../sysdyn/ui/utils/ArrayVariableUtils.java | 147 ++++--- org.simantics.sysdyn/adapters.xml | 8 + org.simantics.sysdyn/scl/Sysdyn.scl | 2 + .../src/org/simantics/sysdyn/Functions.java | 74 +++- .../sysdyn/adapter/CustomMigrationStep.java | 58 +++ .../sysdyn/adapter/ValueIndexVariable.java | 98 +---- .../adapter/ValueIndexVariableBase.java | 110 ++++++ .../sysdyn/adapter/ValueIndexVariableI.java | 23 ++ .../sysdyn/representation/Sheet.java | 6 +- .../representation/utils/IndexUtils.java | 15 +- .../sysdyn/utils/DocumentationUtils.java | 28 ++ .../org/simantics/sysdyn/utils/LoopUtils.java | 10 +- .../simantics/sysdyn/utils/ModelUtils.java | 9 + .../sysdyn/utils/ProfileEntries.java | 7 + 82 files changed, 1311 insertions(+), 528 deletions(-) create mode 100644 org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/CustomMigrationStep.java create mode 100644 org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/ValueIndexVariableBase.java create mode 100644 org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/ValueIndexVariableI.java diff --git a/fi.semantum.sysdyn.solver/META-INF/MANIFEST.MF b/fi.semantum.sysdyn.solver/META-INF/MANIFEST.MF index 7f8fe97d..3256e513 100644 --- a/fi.semantum.sysdyn.solver/META-INF/MANIFEST.MF +++ b/fi.semantum.sysdyn.solver/META-INF/MANIFEST.MF @@ -7,7 +7,8 @@ Bundle-Activator: fi.semantum.sysdyn.solver.Activator Bundle-Vendor: Semantum Oy Require-Bundle: org.eclipse.core.runtime, org.simantics.utils;bundle-version="1.1.0", - org.simantics.databoard;bundle-version="0.6.5" + org.simantics.databoard;bundle-version="0.6.5", + org.simantics.utils.datastructures;bundle-version="1.1.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy Export-Package: fi.semantum.sysdyn.solver diff --git a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Addition.java b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Addition.java index 27ee6841..a407ca4e 100644 --- a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Addition.java +++ b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Addition.java @@ -61,4 +61,11 @@ public class Addition implements IExpression { return this; } + @Override + public void accept(ExpressionVisitor visitor) { + visitor.visit(this); + exp1.accept(visitor); + exp2.accept(visitor); + } + } diff --git a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/And.java b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/And.java index d77a191c..dc3ab53d 100644 --- a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/And.java +++ b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/And.java @@ -13,6 +13,8 @@ package fi.semantum.sysdyn.solver; import java.util.ArrayList; import java.util.Map; +import fi.semantum.sysdyn.solver.IExpression.ExpressionVisitor; + public class And implements IExpression { public IExpression[] exps; @@ -59,4 +61,10 @@ public class And implements IExpression { return this; } + @Override + public void accept(ExpressionVisitor visitor) { + visitor.visit(this); + for(IExpression exp : exps) exp.accept(visitor); + } + } diff --git a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Application.java b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Application.java index c9c2282c..a59ece28 100644 --- a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Application.java +++ b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Application.java @@ -12,6 +12,8 @@ package fi.semantum.sysdyn.solver; import java.util.Map; +import fi.semantum.sysdyn.solver.IExpression.ExpressionVisitor; + public class Application implements IExpression { public String name; @@ -48,4 +50,11 @@ public class Application implements IExpression { return this; } + @Override + public void accept(ExpressionVisitor visitor) { + visitor.visit(this); + for(Argument a : args.args) + a.modification.accept(visitor); + } + } diff --git a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Argument.java b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Argument.java index 3a7013f4..2712ab90 100644 --- a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Argument.java +++ b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Argument.java @@ -12,6 +12,8 @@ package fi.semantum.sysdyn.solver; import java.util.Map; +import fi.semantum.sysdyn.solver.IExpression.ExpressionVisitor; + public class Argument implements IExpression { public String name; @@ -47,4 +49,10 @@ public class Argument implements IExpression { return this; } + @Override + public void accept(ExpressionVisitor visitor) { + visitor.visit(this); + modification.accept(visitor); + } + } diff --git a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Array.java b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Array.java index 72fcd405..45449362 100644 --- a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Array.java +++ b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Array.java @@ -15,6 +15,7 @@ import java.util.Collection; import java.util.Iterator; import java.util.Map; +import fi.semantum.sysdyn.solver.IExpression.ExpressionVisitor; import fi.semantum.sysdyn.solver.SolverUtils.Slice; public class Array implements IExpression { @@ -227,4 +228,15 @@ public class Array implements IExpression { return result; } + @Override + public void accept(ExpressionVisitor visitor) { + visitor.visit(this); + for(int i=0;i elements = new ArrayList(); @@ -110,4 +112,15 @@ public class ForArray implements IExpression { return this; } + @Override + public void accept(ExpressionVisitor visitor) { + visitor.visit(this); + for(int i=0;i copies); + public void accept(ExpressionVisitor visitor); } diff --git a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/IfThenElse.java b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/IfThenElse.java index 2176faf4..a95c99e1 100644 --- a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/IfThenElse.java +++ b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/IfThenElse.java @@ -12,6 +12,8 @@ package fi.semantum.sysdyn.solver; import java.util.Map; +import fi.semantum.sysdyn.solver.IExpression.ExpressionVisitor; + public class IfThenElse implements IExpression { public IExpression exp; @@ -56,4 +58,12 @@ public class IfThenElse implements IExpression { return this; } + @Override + public void accept(ExpressionVisitor visitor) { + visitor.visit(this); + exp.accept(visitor); + t.accept(visitor); + e.accept(visitor); + } + } diff --git a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/LessOrEqualThan.java b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/LessOrEqualThan.java index 7c2f2870..b9ab757e 100644 --- a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/LessOrEqualThan.java +++ b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/LessOrEqualThan.java @@ -12,6 +12,8 @@ package fi.semantum.sysdyn.solver; import java.util.Map; +import fi.semantum.sysdyn.solver.IExpression.ExpressionVisitor; + public class LessOrEqualThan implements IExpression { public IExpression exp1; @@ -51,4 +53,11 @@ public class LessOrEqualThan implements IExpression { return this; } + @Override + public void accept(ExpressionVisitor visitor) { + visitor.visit(this); + exp1.accept(visitor); + exp2.accept(visitor); + } + } diff --git a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/LessThan.java b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/LessThan.java index 9a808538..db798083 100644 --- a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/LessThan.java +++ b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/LessThan.java @@ -12,6 +12,8 @@ package fi.semantum.sysdyn.solver; import java.util.Map; +import fi.semantum.sysdyn.solver.IExpression.ExpressionVisitor; + public class LessThan implements IExpression { public IExpression exp1; @@ -51,4 +53,11 @@ public class LessThan implements IExpression { return this; } + @Override + public void accept(ExpressionVisitor visitor) { + visitor.visit(this); + exp1.accept(visitor); + exp2.accept(visitor); + } + } diff --git a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Multiplication.java b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Multiplication.java index 00397a37..cc4724ab 100644 --- a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Multiplication.java +++ b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Multiplication.java @@ -12,6 +12,8 @@ package fi.semantum.sysdyn.solver; import java.util.Map; +import fi.semantum.sysdyn.solver.IExpression.ExpressionVisitor; + public class Multiplication implements IExpression { public IExpression exp1; @@ -62,4 +64,11 @@ public class Multiplication implements IExpression { return this; } + @Override + public void accept(ExpressionVisitor visitor) { + visitor.visit(this); + exp1.accept(visitor); + exp2.accept(visitor); + } + } diff --git a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Negation.java b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Negation.java index cdf125ba..15e9e2df 100644 --- a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Negation.java +++ b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Negation.java @@ -12,6 +12,8 @@ package fi.semantum.sysdyn.solver; import java.util.Map; +import fi.semantum.sysdyn.solver.IExpression.ExpressionVisitor; + public class Negation implements IExpression { public IExpression exp; @@ -46,4 +48,10 @@ public class Negation implements IExpression { return this; } + @Override + public void accept(ExpressionVisitor visitor) { + visitor.visit(this); + exp.accept(visitor); + } + } diff --git a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/NotEquals.java b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/NotEquals.java index 41ca66a5..5c5499ce 100644 --- a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/NotEquals.java +++ b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/NotEquals.java @@ -12,6 +12,8 @@ package fi.semantum.sysdyn.solver; import java.util.Map; +import fi.semantum.sysdyn.solver.IExpression.ExpressionVisitor; + public class NotEquals implements IExpression { public IExpression exp1; @@ -49,4 +51,11 @@ public class NotEquals implements IExpression { return this; } + @Override + public void accept(ExpressionVisitor visitor) { + visitor.visit(this); + exp1.accept(visitor); + exp2.accept(visitor); + } + } diff --git a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/NullModification.java b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/NullModification.java index 287d6180..cbafd0d9 100644 --- a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/NullModification.java +++ b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/NullModification.java @@ -23,5 +23,10 @@ public class NullModification implements IExpression { public IExpression rewrite(IFrame frame, Map copies) { return this; } + + @Override + public void accept(ExpressionVisitor visitor) { + visitor.visit(this); + } } diff --git a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Or.java b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Or.java index e08c3282..375c9240 100644 --- a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Or.java +++ b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Or.java @@ -13,6 +13,8 @@ package fi.semantum.sysdyn.solver; import java.util.ArrayList; import java.util.Map; +import fi.semantum.sysdyn.solver.IExpression.ExpressionVisitor; + public class Or implements IExpression { public IExpression[] exps; @@ -59,4 +61,10 @@ public class Or implements IExpression { return this; } + @Override + public void accept(ExpressionVisitor visitor) { + visitor.visit(this); + for(IExpression exp : exps) exp.accept(visitor); + } + } diff --git a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/ParameterDeclaration.java b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/ParameterDeclaration.java index 1aa811f7..72cbab5e 100644 --- a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/ParameterDeclaration.java +++ b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/ParameterDeclaration.java @@ -49,4 +49,9 @@ public class ParameterDeclaration implements IExpression { throw new UnsupportedOperationException(); } + @Override + public void accept(ExpressionVisitor visitor) { + throw new UnsupportedOperationException(); + } + } diff --git a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Solver.java b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Solver.java index bcd050d4..1a4aed8c 100644 --- a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Solver.java +++ b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/Solver.java @@ -13,7 +13,15 @@ package fi.semantum.sysdyn.solver; import java.io.StringReader; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.simantics.utils.datastructures.MapList; + +import fi.semantum.sysdyn.solver.IExpression.ExpressionVisitor; import fi.semantum.sysdyn.solver.Model.Globals; import fi.semantum.sysdyn.solver.parser.ModelParser; import fi.semantum.sysdyn.solver.parser.SimpleNode; @@ -27,6 +35,7 @@ public class Solver { private Environment env; private Object[] newValues; + private Object[] derivatives; private double step; private double start; @@ -51,6 +60,52 @@ public class Solver { ready = false; } + private void sortAssignments() { + + final MapList asses = new MapList(); + for(Assignment ass : model.assignments) asses.add(ass.target.base.name, ass); + + final List found = new ArrayList(); + final Set visited = new HashSet(); + + ExpressionVisitor sortVisitor = new ExpressionVisitor() { + @Override + public void visit(IExpression expression) { + if(expression instanceof Variable) { + Variable var = (Variable)expression; + if(visited.add(var.base.name)) { + for(Assignment ass : asses.getValues(var.base.name)) { + ass.expression.accept(this); + if(ass.subscripts != null) + for(IExpression e : ass.subscripts) e.accept(this); + } + found.add(var.base); + } + } + } + }; + + // Sort assignments + for(Assignment ass : model.assignments) { + ass.target.accept(sortVisitor); + } + + Collections.sort(model.assignments, new Comparator() { + + @Override + public int compare(Assignment o1, Assignment o2) { + int i1 = found.indexOf(o1.target.base); + int i2 = found.indexOf(o2.target.base); + if(i1 < i2) return -1; + else if (i1 > i2) return 1; + return 0; + } + + + }); + + } + public void prepare(String input) throws Exception { long startNanos = System.nanoTime(); @@ -79,11 +134,14 @@ public class Solver { env.valueTable = new Object[size+STACK_SIZE]; + sortAssignments(); + model.assignmentArray = model.assignments.toArray(new Assignment[model.assignments.size()]); model.derivativeArray = model.derivatives.toArray(new Assignment[model.derivatives.size()]); model.parameterArray = model.parameters.toArray(new ParameterDeclaration[model.parameters.size()]); newValues = new Object[Math.max(model.assignments.size(),model.derivatives.size())]; + derivatives = new Object[model.derivatives.size()]; int condition = 1; int loops = 0; @@ -185,6 +243,8 @@ public class Solver { return env.getValueArray(); } + + public void step() { // TODO: do something more sensible if the solver is not ready if (!ready) return; @@ -192,24 +252,24 @@ public class Solver { Assignment[] assignments = model.assignmentArray; Assignment[] derivatives = model.derivativeArray; - // should probably be wrapped inside a method or something - env.time += env.step; - - // Solve algebraic equations - for(int i=0;i= 0) { la1tokens[jj_kind] = true; jj_kind = -1; @@ -5954,10 +5959,13 @@ public class ModelParser/*@bgen(jjtree)*/implements ModelParserTreeConstants, Mo if ((jj_la1_2[i] & (1<", "", + "", "", "", "\"operator function\"", diff --git a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/parser/ModelParserTokenManager.java b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/parser/ModelParserTokenManager.java index 754f36e8..5aa460e2 100644 --- a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/parser/ModelParserTokenManager.java +++ b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/parser/ModelParserTokenManager.java @@ -15,20 +15,25 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1) switch (pos) { case 0: - if ((active0 & 0x3ffffffffffffff0L) != 0L || (active1 & 0xc0000000L) != 0L) + if ((active1 & 0x80000L) != 0L) + return 20; + if ((active0 & 0x377bdef7bdef7bf0L) != 0L || (active1 & 0x180000000L) != 0L) { jjmatchedKind = 90; return 2; } - if ((active1 & 0x80000L) != 0L) - return 13; if ((active1 & 0xb30010L) != 0L) - return 9; + return 13; + if ((active0 & 0x884210842108400L) != 0L) + { + jjmatchedKind = 90; + return 44; + } return -1; case 1: if ((active0 & 0x108420080400000L) != 0L) return 2; - if ((active0 & 0x3ef7bdff7fbffff0L) != 0L || (active1 & 0xc0000000L) != 0L) + if ((active0 & 0x3ef7bdff7fbffff0L) != 0L || (active1 & 0x180000000L) != 0L) { if (jjmatchedPos != 1) { @@ -41,7 +46,7 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1) case 2: if ((active0 & 0x400000800201200L) != 0L) return 2; - if ((active0 & 0x3bfffdf77f9fedf0L) != 0L || (active1 & 0xc0000000L) != 0L) + if ((active0 & 0x3bfffdf77f9fedf0L) != 0L || (active1 & 0x180000000L) != 0L) { jjmatchedKind = 90; jjmatchedPos = 2; @@ -51,7 +56,7 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1) case 3: if ((active0 & 0x1000084212118400L) != 0L) return 2; - if ((active0 & 0x2bfff5b56d8e69f0L) != 0L || (active1 & 0xc0000000L) != 0L) + if ((active0 & 0x2bfff5b56d8e69f0L) != 0L || (active1 & 0x180000000L) != 0L) { if (jjmatchedPos != 3) { @@ -64,7 +69,7 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1) case 4: if ((active0 & 0x1090004290008c0L) != 0L) return 2; - if ((active0 & 0x2af6f5b1469e6130L) != 0L || (active1 & 0xc0000000L) != 0L) + if ((active0 & 0x2af6f5b1469e6130L) != 0L || (active1 & 0x180000000L) != 0L) { jjmatchedKind = 90; jjmatchedPos = 4; @@ -74,7 +79,7 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1) case 5: if ((active0 & 0x22200011009c0000L) != 0L) return 2; - if ((active0 & 0x8d6f5a046026130L) != 0L || (active1 & 0xc0000000L) != 0L) + if ((active0 & 0x8d6f5a046026130L) != 0L || (active1 & 0x180000000L) != 0L) { jjmatchedKind = 90; jjmatchedPos = 5; @@ -84,7 +89,7 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1) case 6: if ((active0 & 0x80d0a000000000L) != 0L) return 2; - if ((active0 & 0x856250046026130L) != 0L || (active1 & 0xc0000000L) != 0L) + if ((active0 & 0x856250046026130L) != 0L || (active1 & 0x180000000L) != 0L) { if (jjmatchedPos != 6) { @@ -104,7 +109,7 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1) } return 2; } - if ((active0 & 0x802200006020020L) != 0L || (active1 & 0xc0000000L) != 0L) + if ((active0 & 0x802200006020020L) != 0L || (active1 & 0x180000000L) != 0L) return 2; return -1; case 8: @@ -185,7 +190,7 @@ private int jjMoveStringLiteralDfa0_0() jjmatchedKind = 68; return jjMoveStringLiteralDfa1_0(0x0L, 0xb30000L); case 47: - return jjStartNfaWithStates_0(0, 83, 13); + return jjStartNfaWithStates_0(0, 83, 20); case 58: jjmatchedKind = 69; return jjMoveStringLiteralDfa1_0(0x0L, 0x2000000L); @@ -227,7 +232,7 @@ private int jjMoveStringLiteralDfa0_0() case 110: return jjMoveStringLiteralDfa1_0(0x1000L, 0x0L); case 111: - return jjMoveStringLiteralDfa1_0(0x108420000L, 0xc0000000L); + return jjMoveStringLiteralDfa1_0(0x108420000L, 0x180000000L); case 112: return jjMoveStringLiteralDfa1_0(0x210842000000000L, 0x0L); case 114: @@ -315,7 +320,7 @@ private int jjMoveStringLiteralDfa1_0(long active0, long active1) case 111: return jjMoveStringLiteralDfa2_0(active0, 0x1042108000201080L, active1, 0L); case 112: - return jjMoveStringLiteralDfa2_0(active0, 0x20000L, active1, 0xc0000000L); + return jjMoveStringLiteralDfa2_0(active0, 0x20000L, active1, 0x180000000L); case 113: return jjMoveStringLiteralDfa2_0(active0, 0x200000000000L, active1, 0L); case 114: @@ -361,7 +366,7 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long a return jjStartNfaWithStates_0(2, 35, 2); return jjMoveStringLiteralDfa3_0(active0, 0x180L, active1, 0L); case 101: - return jjMoveStringLiteralDfa3_0(active0, 0x80030020000L, active1, 0xc0000000L); + return jjMoveStringLiteralDfa3_0(active0, 0x80030020000L, active1, 0x180000000L); case 103: return jjMoveStringLiteralDfa3_0(active0, 0x10L, active1, 0L); case 105: @@ -442,7 +447,7 @@ private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long a return jjStartNfaWithStates_0(3, 60, 2); return jjMoveStringLiteralDfa4_0(active0, 0x100000000L, active1, 0L); case 114: - return jjMoveStringLiteralDfa4_0(active0, 0x20000L, active1, 0xc0000000L); + return jjMoveStringLiteralDfa4_0(active0, 0x20000L, active1, 0x180000000L); case 115: return jjMoveStringLiteralDfa4_0(active0, 0x42000400000040L, active1, 0L); case 116: @@ -470,7 +475,7 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a switch(curChar) { case 97: - return jjMoveStringLiteralDfa5_0(active0, 0x2000822000L, active1, 0xc0000000L); + return jjMoveStringLiteralDfa5_0(active0, 0x2000822000L, active1, 0x180000000L); case 99: return jjMoveStringLiteralDfa5_0(active0, 0x100L, active1, 0L); case 101: @@ -578,7 +583,7 @@ private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long a return jjStartNfaWithStates_0(5, 32, 2); else if ((active0 & 0x1000000000L) != 0L) return jjStartNfaWithStates_0(5, 36, 2); - return jjMoveStringLiteralDfa6_0(active0, 0x20000L, active1, 0xc0000000L); + return jjMoveStringLiteralDfa6_0(active0, 0x20000L, active1, 0x180000000L); default : break; } @@ -610,7 +615,7 @@ private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long a case 110: return jjMoveStringLiteralDfa7_0(active0, 0x2000000000000L, active1, 0L); case 111: - return jjMoveStringLiteralDfa7_0(active0, 0x200004020000L, active1, 0xc0000000L); + return jjMoveStringLiteralDfa7_0(active0, 0x200004020000L, active1, 0x180000000L); case 115: if ((active0 & 0x80000000000000L) != 0L) return jjStartNfaWithStates_0(6, 55, 2); @@ -672,7 +677,7 @@ private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, long a jjmatchedKind = 17; jjmatchedPos = 7; } - return jjMoveStringLiteralDfa8_0(active0, 0x100L, active1, 0xc0000000L); + return jjMoveStringLiteralDfa8_0(active0, 0x100L, active1, 0x180000000L); case 116: if ((active0 & 0x2000000000000L) != 0L) return jjStartNfaWithStates_0(7, 49, 2); @@ -694,7 +699,7 @@ private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, long a switch(curChar) { case 32: - return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0xc0000000L); + return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x180000000L); case 97: return jjMoveStringLiteralDfa9_0(active0, 0x40000000L, active1, 0L); case 98: @@ -746,7 +751,7 @@ private int jjMoveStringLiteralDfa9_0(long old0, long active0, long old1, long a return jjStartNfaWithStates_0(9, 50, 2); return jjMoveStringLiteralDfa10_0(active0, 0x40000000000000L, active1, 0L); case 102: - return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0x40000000L); + return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0x80000000L); case 108: return jjMoveStringLiteralDfa10_0(active0, 0x2000L, active1, 0L); case 110: @@ -756,7 +761,7 @@ private int jjMoveStringLiteralDfa9_0(long old0, long active0, long old1, long a case 111: return jjMoveStringLiteralDfa10_0(active0, 0x10000000000L, active1, 0L); case 114: - return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0x80000000L); + return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0x100000000L); case 116: return jjMoveStringLiteralDfa10_0(active0, 0x40000000L, active1, 0L); default : @@ -780,13 +785,13 @@ private int jjMoveStringLiteralDfa10_0(long old0, long active0, long old1, long case 101: if ((active0 & 0x2000L) != 0L) return jjStartNfaWithStates_0(10, 13, 2); - return jjMoveStringLiteralDfa11_0(active0, 0x40000000L, active1, 0x80000000L); + return jjMoveStringLiteralDfa11_0(active0, 0x40000000L, active1, 0x100000000L); case 110: if ((active0 & 0x10000000000L) != 0L) return jjStartNfaWithStates_0(10, 40, 2); break; case 117: - return jjMoveStringLiteralDfa11_0(active0, 0L, active1, 0x40000000L); + return jjMoveStringLiteralDfa11_0(active0, 0L, active1, 0x80000000L); default : break; } @@ -806,13 +811,13 @@ private int jjMoveStringLiteralDfa11_0(long old0, long active0, long old1, long case 98: return jjMoveStringLiteralDfa12_0(active0, 0x40000000000000L, active1, 0L); case 99: - return jjMoveStringLiteralDfa12_0(active0, 0L, active1, 0x80000000L); + return jjMoveStringLiteralDfa12_0(active0, 0L, active1, 0x100000000L); case 100: if ((active0 & 0x40000000L) != 0L) return jjStartNfaWithStates_0(11, 30, 2); break; case 110: - return jjMoveStringLiteralDfa12_0(active0, 0L, active1, 0x40000000L); + return jjMoveStringLiteralDfa12_0(active0, 0L, active1, 0x80000000L); default : break; } @@ -830,9 +835,9 @@ private int jjMoveStringLiteralDfa12_0(long old0, long active0, long old1, long switch(curChar) { case 99: - return jjMoveStringLiteralDfa13_0(active0, 0L, active1, 0x40000000L); - case 111: return jjMoveStringLiteralDfa13_0(active0, 0L, active1, 0x80000000L); + case 111: + return jjMoveStringLiteralDfa13_0(active0, 0L, active1, 0x100000000L); case 121: if ((active0 & 0x40000000000000L) != 0L) return jjStartNfaWithStates_0(12, 54, 2); @@ -854,9 +859,9 @@ private int jjMoveStringLiteralDfa13_0(long old0, long active0, long old1, long switch(curChar) { case 114: - return jjMoveStringLiteralDfa14_0(active1, 0x80000000L); + return jjMoveStringLiteralDfa14_0(active1, 0x100000000L); case 116: - return jjMoveStringLiteralDfa14_0(active1, 0x40000000L); + return jjMoveStringLiteralDfa14_0(active1, 0x80000000L); default : break; } @@ -874,11 +879,11 @@ private int jjMoveStringLiteralDfa14_0(long old1, long active1) switch(curChar) { case 100: - if ((active1 & 0x80000000L) != 0L) - return jjStopAtPos(14, 95); + if ((active1 & 0x100000000L) != 0L) + return jjStopAtPos(14, 96); break; case 105: - return jjMoveStringLiteralDfa15_0(active1, 0x40000000L); + return jjMoveStringLiteralDfa15_0(active1, 0x80000000L); default : break; } @@ -896,7 +901,7 @@ private int jjMoveStringLiteralDfa15_0(long old1, long active1) switch(curChar) { case 111: - return jjMoveStringLiteralDfa16_0(active1, 0x40000000L); + return jjMoveStringLiteralDfa16_0(active1, 0x80000000L); default : break; } @@ -914,8 +919,8 @@ private int jjMoveStringLiteralDfa16_0(long old1, long active1) switch(curChar) { case 110: - if ((active1 & 0x40000000L) != 0L) - return jjStopAtPos(16, 94); + if ((active1 & 0x80000000L) != 0L) + return jjStopAtPos(16, 95); break; default : break; @@ -936,7 +941,7 @@ static final long[] jjbitVec0 = { private int jjMoveNfa_0(int startState, int curPos) { int startsAt = 0; - jjnewStateCnt = 31; + jjnewStateCnt = 44; int i = 1; jjstateSet[0] = startState; int kind = 0x7fffffff; @@ -951,22 +956,12 @@ private int jjMoveNfa_0(int startState, int curPos) { switch(jjstateSet[--i]) { - case 13: - if (curChar == 47) - { - if (kind > 3) - kind = 3; - jjCheckNAdd(20); - } - else if (curChar == 42) - jjCheckNAddStates(0, 2); - break; case 0: if ((0x3ff000000000000L & l) != 0L) { - if (kind > 92) - kind = 92; - jjCheckNAddStates(3, 7); + if (kind > 93) + kind = 93; + jjCheckNAddStates(0, 6); } else if ((0x100002600L & l) != 0L) { @@ -974,140 +969,179 @@ private int jjMoveNfa_0(int startState, int curPos) kind = 1; } else if (curChar == 47) - jjAddStates(8, 9); + jjAddStates(7, 8); else if (curChar == 46) - jjCheckNAdd(9); + jjCheckNAdd(13); else if (curChar == 34) - jjCheckNAddStates(10, 12); + jjCheckNAddStates(9, 11); + break; + case 44: + if ((0x3ff400000000000L & l) != 0L) + { + if (kind > 90) + kind = 90; + jjCheckNAdd(2); + } + else if (curChar == 45) + { + if (kind > 92) + kind = 92; + } + break; + case 20: + if (curChar == 47) + { + if (kind > 3) + kind = 3; + jjCheckNAdd(27); + } + else if (curChar == 42) + jjCheckNAddStates(12, 14); break; case 2: if ((0x3ff400000000000L & l) == 0L) break; if (kind > 90) kind = 90; - jjstateSet[jjnewStateCnt++] = 2; + jjCheckNAdd(2); break; case 3: if (curChar == 34) - jjCheckNAddStates(10, 12); + jjCheckNAddStates(9, 11); break; case 4: if ((0xfffffffbfffffbffL & l) != 0L) - jjCheckNAddStates(10, 12); + jjCheckNAddStates(9, 11); break; case 6: if ((0xfffffffffffffbffL & l) != 0L) - jjCheckNAddStates(10, 12); + jjCheckNAddStates(9, 11); break; case 7: if (curChar == 34 && kind > 91) kind = 91; break; - case 8: + case 9: + if (curChar == 45 && kind > 92) + kind = 92; + break; + case 12: if (curChar == 46) - jjCheckNAdd(9); + jjCheckNAdd(13); break; - case 9: + case 13: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 93) - kind = 93; - jjCheckNAddTwoStates(9, 10); + if (kind > 94) + kind = 94; + jjCheckNAddStates(15, 18); break; - case 11: + case 15: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 93) - kind = 93; - jjstateSet[jjnewStateCnt++] = 11; + if (kind > 94) + kind = 94; + jjCheckNAdd(15); break; - case 12: + case 16: + if (curChar == 45) + jjCheckNAdd(15); + break; + case 19: if (curChar == 47) - jjAddStates(8, 9); + jjAddStates(7, 8); break; - case 14: + case 21: if ((0xfffffbffffffffffL & l) != 0L) - jjCheckNAddStates(0, 2); + jjCheckNAddStates(12, 14); break; - case 15: + case 22: if (curChar == 42) - jjstateSet[jjnewStateCnt++] = 16; + jjstateSet[jjnewStateCnt++] = 23; break; - case 16: + case 23: if ((0xffff7fffffffffffL & l) != 0L) - jjCheckNAddStates(0, 2); + jjCheckNAddStates(12, 14); break; - case 17: + case 24: if (curChar == 47 && kind > 2) kind = 2; break; - case 18: + case 25: if (curChar == 42) - jjstateSet[jjnewStateCnt++] = 17; + jjstateSet[jjnewStateCnt++] = 24; break; - case 19: + case 26: if (curChar != 47) break; if (kind > 3) kind = 3; - jjCheckNAdd(20); + jjCheckNAdd(27); break; - case 20: + case 27: if ((0xfffffffffffffbffL & l) == 0L) break; if (kind > 3) kind = 3; - jjCheckNAdd(20); + jjCheckNAdd(27); break; - case 21: + case 28: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 92) - kind = 92; - jjCheckNAddStates(3, 7); + if (kind > 93) + kind = 93; + jjCheckNAddStates(0, 6); break; - case 22: + case 29: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 92) - kind = 92; - jjCheckNAdd(22); + if (kind > 93) + kind = 93; + jjCheckNAdd(29); break; - case 23: + case 30: if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddTwoStates(23, 24); + jjCheckNAddTwoStates(30, 31); break; - case 24: + case 31: if (curChar != 46) break; - if (kind > 93) - kind = 93; - jjCheckNAddTwoStates(25, 26); + if (kind > 94) + kind = 94; + jjCheckNAddStates(19, 22); break; - case 25: + case 32: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 93) - kind = 93; - jjCheckNAddTwoStates(25, 26); + if (kind > 94) + kind = 94; + jjCheckNAddStates(19, 22); break; - case 27: + case 34: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 93) - kind = 93; - jjstateSet[jjnewStateCnt++] = 27; + if (kind > 94) + kind = 94; + jjCheckNAdd(34); break; - case 28: + case 35: + if (curChar == 45) + jjCheckNAdd(34); + break; + case 38: if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddTwoStates(28, 29); + jjCheckNAddStates(23, 26); break; - case 30: + case 40: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 93) - kind = 93; - jjstateSet[jjnewStateCnt++] = 30; + if (kind > 94) + kind = 94; + jjCheckNAdd(40); + break; + case 41: + if (curChar == 45) + jjCheckNAdd(40); break; default : break; } @@ -1121,6 +1155,23 @@ private int jjMoveNfa_0(int startState, int curPos) switch(jjstateSet[--i]) { case 0: + if ((0x7fffffe87fffffeL & l) != 0L) + { + if (kind > 90) + kind = 90; + jjCheckNAdd(2); + } + if ((0x2000000020L & l) != 0L) + { + if (kind > 92) + kind = 92; + } + if (curChar == 69) + jjCheckNAdd(9); + else if (curChar == 101) + jjCheckNAdd(9); + break; + case 44: case 2: if ((0x7fffffe87fffffeL & l) == 0L) break; @@ -1128,37 +1179,80 @@ private int jjMoveNfa_0(int startState, int curPos) kind = 90; jjCheckNAdd(2); break; + case 1: + if ((0x7fffffe87fffffeL & l) == 0L) + break; + if (kind > 90) + kind = 90; + jjCheckNAdd(2); + break; case 4: if ((0xffffffffefffffffL & l) != 0L) - jjCheckNAddStates(10, 12); + jjCheckNAddStates(9, 11); break; case 5: if (curChar == 92) jjstateSet[jjnewStateCnt++] = 6; break; case 6: - jjCheckNAddStates(10, 12); + jjCheckNAddStates(9, 11); + break; + case 8: + if ((0x2000000020L & l) != 0L && kind > 92) + kind = 92; break; case 10: - if ((0x2000000020L & l) != 0L) - jjstateSet[jjnewStateCnt++] = 11; + if (curChar == 101) + jjCheckNAdd(9); + break; + case 11: + if (curChar == 69) + jjCheckNAdd(9); break; case 14: - case 16: - jjCheckNAddStates(0, 2); + if ((0x2000000020L & l) != 0L) + jjstateSet[jjnewStateCnt++] = 15; break; - case 20: + case 17: + if (curChar == 101) + jjCheckNAdd(16); + break; + case 18: + if (curChar == 69) + jjCheckNAdd(16); + break; + case 21: + case 23: + jjCheckNAddStates(12, 14); + break; + case 27: if (kind > 3) kind = 3; - jjstateSet[jjnewStateCnt++] = 20; + jjstateSet[jjnewStateCnt++] = 27; break; - case 26: + case 33: if ((0x2000000020L & l) != 0L) - jjstateSet[jjnewStateCnt++] = 27; + jjstateSet[jjnewStateCnt++] = 34; break; - case 29: + case 36: + if (curChar == 101) + jjCheckNAdd(35); + break; + case 37: + if (curChar == 69) + jjCheckNAdd(35); + break; + case 39: if ((0x2000000020L & l) != 0L) - jjstateSet[jjnewStateCnt++] = 30; + jjstateSet[jjnewStateCnt++] = 40; + break; + case 42: + if (curChar == 101) + jjCheckNAdd(41); + break; + case 43: + if (curChar == 69) + jjCheckNAdd(41); break; default : break; } @@ -1175,19 +1269,19 @@ private int jjMoveNfa_0(int startState, int curPos) case 4: case 6: if ((jjbitVec0[i2] & l2) != 0L) - jjCheckNAddStates(10, 12); + jjCheckNAddStates(9, 11); break; - case 14: - case 16: + case 21: + case 23: if ((jjbitVec0[i2] & l2) != 0L) - jjCheckNAddStates(0, 2); + jjCheckNAddStates(12, 14); break; - case 20: + case 27: if ((jjbitVec0[i2] & l2) == 0L) break; if (kind > 3) kind = 3; - jjstateSet[jjnewStateCnt++] = 20; + jjstateSet[jjnewStateCnt++] = 27; break; default : break; } @@ -1200,14 +1294,15 @@ private int jjMoveNfa_0(int startState, int curPos) kind = 0x7fffffff; } ++curPos; - if ((i = jjnewStateCnt) == (startsAt = 31 - (jjnewStateCnt = startsAt))) + if ((i = jjnewStateCnt) == (startsAt = 44 - (jjnewStateCnt = startsAt))) return curPos; try { curChar = input_stream.readChar(); } catch(java.io.IOException e) { return curPos; } } } static final int[] jjnextStates = { - 14, 15, 18, 22, 23, 24, 28, 29, 13, 19, 4, 5, 7, + 29, 30, 31, 38, 39, 42, 43, 20, 26, 4, 5, 7, 21, 22, 25, 13, + 14, 17, 18, 32, 33, 36, 37, 38, 39, 42, 43, }; /** Token literal values. */ @@ -1232,7 +1327,7 @@ public static final String[] jjstrLiteralImages = { "\145\170\164\145\162\156\141\154", "\154\157\157\160", "\162\145\143\157\162\144", "\50", "\51", "\173", "\175", "\133", "\135", "\56", "\72", "\73", "\54", "\74", "\74\75", "\76", "\76\75", "\75\75", "\74\76", "\53", "\55", "\56\53", "\56\55", "\52", "\57", "\56\52", "\56\57", -"\136", "\56\136", "\75", "\72\75", null, null, null, null, +"\136", "\56\136", "\75", "\72\75", null, null, null, null, null, "\157\160\145\162\141\164\157\162\40\146\165\156\143\164\151\157\156", "\157\160\145\162\141\164\157\162\40\162\145\143\157\162\144", }; /** Lexer state names. */ @@ -1240,14 +1335,14 @@ public static final String[] lexStateNames = { "DEFAULT", }; static final long[] jjtoToken = { - 0xfffffffffffffff1L, 0xffffffffL, + 0xfffffffffffffff1L, 0x1ffffffffL, }; static final long[] jjtoSkip = { 0xeL, 0x0L, }; protected SimpleCharStream input_stream; -private final int[] jjrounds = new int[31]; -private final int[] jjstateSet = new int[62]; +private final int[] jjrounds = new int[44]; +private final int[] jjstateSet = new int[88]; private final StringBuilder jjimage = new StringBuilder(); private StringBuilder image = jjimage; private int jjimageLen; @@ -1278,7 +1373,7 @@ private void ReInitRounds() { int i; jjround = 0x80000001; - for (i = 31; i-- > 0;) + for (i = 44; i-- > 0;) jjrounds[i] = 0x80000000; } diff --git a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/parser/ModelicaParser.jj b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/parser/ModelicaParser.jj index a6dceb85..2ba477f3 100644 --- a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/parser/ModelicaParser.jj +++ b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/parser/ModelicaParser.jj @@ -78,11 +78,12 @@ TOKEN: | | { matchedToken.image = matchedToken.image.substring(1,matchedToken.image.length()-1); } +| | | "." ()? (["e","E"] )? - | "." (["e","E"] )? - | ["e","E"] + ( "." ()? ( )? + | "." ( )? + | ) > } diff --git a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/parser/ModelicaParser.jjt b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/parser/ModelicaParser.jjt index 422e38fd..0296fd88 100644 --- a/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/parser/ModelicaParser.jjt +++ b/fi.semantum.sysdyn.solver/src/fi/semantum/sysdyn/solver/parser/ModelicaParser.jjt @@ -74,11 +74,12 @@ TOKEN: | | { matchedToken.image = matchedToken.image.substring(1,matchedToken.image.length()-1); } +| | | "." ()? (["e","E"] )? - | "." (["e","E"] )? - | ["e","E"] + ( "." ()? ( )? + | "." ( )? + | ) > } diff --git a/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/AdjustableTab.java b/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/AdjustableTab.java index da4bae8c..7fffd394 100644 --- a/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/AdjustableTab.java +++ b/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/AdjustableTab.java @@ -30,6 +30,7 @@ public abstract class AdjustableTab extends LabelPropertyTabContributor { private Composite spp; private ControlListener controlListener; private static final int WIDE_SCREEN_WIDTH = 1100; + protected Composite composite; @Override public void createControls(Composite body, IWorkbenchSite site, ISessionContext context, WidgetSupport _support) { @@ -47,7 +48,7 @@ public abstract class AdjustableTab extends LabelPropertyTabContributor { @Override public void controlResized(ControlEvent e) { - createLayout(); + createLayout(); } }); @@ -70,6 +71,9 @@ public abstract class AdjustableTab extends LabelPropertyTabContributor { * Create layout for controls. */ protected void createLayout() { + if (composite == null || composite.isDisposed()) + return; + Point size = spp.getSize(); if (size.x > size.y) { createControlLayoutHorizontal((size.x > WIDE_SCREEN_WIDTH)); @@ -98,10 +102,10 @@ public abstract class AdjustableTab extends LabelPropertyTabContributor { */ protected abstract void createControlLayoutHorizontal(boolean wideScreen); - @Override - public void dispose() { - if(controlListener != null && spp != null) - spp.removeControlListener(controlListener); - } +// @Override +// public void dispose() { +// if(controlListener != null && spp != null) +// spp.removeControlListener(controlListener); +// } } diff --git a/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/LabelPropertyTabContributor.java b/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/LabelPropertyTabContributor.java index 045b4d31..8c0441c4 100644 --- a/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/LabelPropertyTabContributor.java +++ b/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/LabelPropertyTabContributor.java @@ -12,59 +12,33 @@ package org.simantics.jfreechart.chart.properties; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.ui.IWorkbenchSite; -import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupportImpl; -import org.simantics.db.AsyncReadGraph; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.variable.Variable; -import org.simantics.db.management.ISessionContext; -import org.simantics.db.procedure.AsyncListener; import org.simantics.db.request.Read; import org.simantics.layer0.Layer0; import org.simantics.modeling.ModelingResources; import org.simantics.selectionview.PropertyTabContributorImpl; -import org.simantics.ui.SimanticsUI; -import org.simantics.utils.datastructures.Callback; import org.simantics.utils.ui.AdaptionUtils; public abstract class LabelPropertyTabContributor extends PropertyTabContributorImpl { - private boolean isDisposed = false; - - - public void createControl(Composite parent, final IWorkbenchSite site, final ISessionContext context, final WidgetSupportImpl support) { - super.createControl(parent, site, context, support); - - // Add dispose listener to make sure name listening receives the correct isDisposed -value - parent.addDisposeListener(new DisposeListener() { - - @Override - public void widgetDisposed(DisposeEvent e) { - LabelPropertyTabContributor.this.dispose(); - } - }); - } - @Override - public void updatePartName(ISelection forSelection, final Callback updateCallback) { - final Variable variable = AdaptionUtils.adaptToSingle(forSelection, Variable.class); - final Resource resource = AdaptionUtils.adaptToSingle(forSelection, Resource.class); - if(resource == null && variable == null) { - updateCallback.run("Selection properties"); - return; - } + public Read getPartNameReadRequest(final ISelection forSelection) { - SimanticsUI.getSession().asyncRequest(new Read() { + return new Read() { @Override public String perform(ReadGraph graph) throws DatabaseException { Layer0 l0 = Layer0.getInstance(graph); ModelingResources mr = ModelingResources.getInstance(graph); + + final Variable variable = AdaptionUtils.adaptToSingle(forSelection, Variable.class); + final Resource resource = AdaptionUtils.adaptToSingle(forSelection, Resource.class); + if(resource == null && variable == null) { + return "Selection"; + } Resource r; if(variable != null) { @@ -84,27 +58,9 @@ public abstract class LabelPropertyTabContributor extends PropertyTabContributor return label; return "No name for selection"; } - }, new AsyncListener() { - - @Override - public void execute(AsyncReadGraph graph, String result) { - updateCallback.run(result); - } - - @Override - public void exception(AsyncReadGraph graph, Throwable throwable) { - - } - - @Override - public boolean isDisposed() { - return isDisposed; - } - }); + + }; + } - @Override - protected void dispose() { - this.isDisposed = true; - } } diff --git a/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/bar/BarAxisTab.java b/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/bar/BarAxisTab.java index d8228492..38f7d21e 100644 --- a/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/bar/BarAxisTab.java +++ b/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/bar/BarAxisTab.java @@ -67,7 +67,6 @@ public class BarAxisTab extends AdjustableTab implements Widget { private WidgetSupportImpl rangeAxisSupport = new WidgetSupportImpl(); private TrackedText rangelabel, rangemin, rangemax; private ScrolledComposite sc; - private Composite composite; private Group domainGroup; private Label labelLabel; private AxisHidePropertyComposite axisHide; diff --git a/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/bar/BarGeneralPropertiesTab.java b/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/bar/BarGeneralPropertiesTab.java index 9d669b6c..fa60a3e5 100644 --- a/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/bar/BarGeneralPropertiesTab.java +++ b/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/bar/BarGeneralPropertiesTab.java @@ -64,7 +64,6 @@ import org.simantics.sysdyn.JFreeChartResource; public class BarGeneralPropertiesTab extends AdjustableTab { private ScrolledComposite sc; - private Composite composite; private Button hgrid, htitle, hlegend; private TrackedText name, title, time; private TrackedCombo type; diff --git a/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/bar/BarSeriesTab.java b/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/bar/BarSeriesTab.java index 51eefa75..5a9c55a2 100644 --- a/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/bar/BarSeriesTab.java +++ b/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/bar/BarSeriesTab.java @@ -61,7 +61,6 @@ public class BarSeriesTab extends AdjustableTab implements Widget { private Resource chartResource; private BarSeriesPropertyComposite spc; private int options; - private Composite composite; private Composite buttonComposite; public BarSeriesTab(int options) { diff --git a/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/pie/PieGeneralPropertiesTab.java b/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/pie/PieGeneralPropertiesTab.java index e32a1c7f..3e2b2d2d 100644 --- a/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/pie/PieGeneralPropertiesTab.java +++ b/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/pie/PieGeneralPropertiesTab.java @@ -51,7 +51,6 @@ import org.simantics.sysdyn.JFreeChartResource; public class PieGeneralPropertiesTab extends AdjustableTab { private ScrolledComposite sc; - private Composite composite; private Button htitle, hlegend, hlabels; private TrackedText name, title, time; diff --git a/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/pie/PieSeriesTab.java b/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/pie/PieSeriesTab.java index ad0ca645..d5cf346a 100644 --- a/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/pie/PieSeriesTab.java +++ b/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/pie/PieSeriesTab.java @@ -60,7 +60,6 @@ public class PieSeriesTab extends AdjustableTab implements Widget { private Button add, remove; private Resource chartResource; private int options; - private Composite composite; private Composite buttonComposite; public PieSeriesTab(int options) { diff --git a/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/xyline/XYLineAxisAndVariablesTab.java b/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/xyline/XYLineAxisAndVariablesTab.java index 92d4f9e0..98d7107e 100644 --- a/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/xyline/XYLineAxisAndVariablesTab.java +++ b/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/xyline/XYLineAxisAndVariablesTab.java @@ -63,7 +63,6 @@ public class XYLineAxisAndVariablesTab extends AdjustableTab { private ScrolledComposite propertyContainer; private Button addAxis, addVariable, remove; private WidgetSupportImpl additionalSupport; - private Composite composite; private Composite buttonComposite; public XYLineAxisAndVariablesTab() { diff --git a/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/xyline/XYLineGeneralPropertiesTab.java b/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/xyline/XYLineGeneralPropertiesTab.java index 2ab8ae98..495a36e1 100644 --- a/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/xyline/XYLineGeneralPropertiesTab.java +++ b/org.simantics.jfreechart/src/org/simantics/jfreechart/chart/properties/xyline/XYLineGeneralPropertiesTab.java @@ -72,7 +72,6 @@ import org.simantics.utils.ui.AdaptionUtils; public class XYLineGeneralPropertiesTab extends AdjustableTab implements Widget { private ScrolledComposite sc; - private Composite composite; private TrackedText name, title, xlabel, xvariable, xmin, xmax; private TrackedCombo type; private Button hgrid, htitle, hlegend; diff --git a/org.simantics.sysdyn.feature/rootfiles/sampleModels/Tourists Environments And Hotel Facilities.sysdyn b/org.simantics.sysdyn.feature/rootfiles/sampleModels/Tourists Environments And Hotel Facilities.sysdyn index 7af5e56704ca7fd21be45af9b8a565c716198412..def1fc4c08b182826ba6b97a35391bf2a22fd7b3 100644 GIT binary patch literal 74492 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 literal 74715 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 literal 175973 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 z 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 Za1^f2eYxg^?YQ@txD@wFV#>b${{l+KIpqKV diff --git a/org.simantics.sysdyn.ontology/graph/Migration.pgraph b/org.simantics.sysdyn.ontology/graph/Migration.pgraph index c52fecbc..cf2c2db9 100644 --- a/org.simantics.sysdyn.ontology/graph/Migration.pgraph +++ b/org.simantics.sysdyn.ontology/graph/Migration.pgraph @@ -34,6 +34,7 @@ FROM16TO17 = MIGRATION."from1.6to1.7" : L0.MigrationSequence FROM16TO17.Spreadsheets FROM16TO17.SysdynChanges FROM16TO17.OrderedSetsToLists + FROM16TO17.Custom : L0.MigrationStep FROM16TO17.Ontologies : L0.NamespaceMigrationStep @L0.list @@ -74,7 +75,50 @@ FROM16TO17.Ontologies : L0.NamespaceMigrationStep _ @move"http://www.simantics.org/User-" "1.0" "1.1" _ - @move"http://www.simantics.org/Documentation-" "1.0" "1.1" + @move"http://" "www.simantics.org/Documentation-1.1/Components" "www.semantum.fi/Simupedia-1.0/Components" + _ + @move"http://" "www.simantics.org/Documentation-1.1/Symbols" "www.semantum.fi/Simupedia-1.0/Symbols" + _ + @move"http://" "www.simantics.org/Documentation-1.1/Properties" "www.semantum.fi/Simupedia-1.0/Properties" + _ + @move"http://" "www.simantics.org/Documentation-1.1/DiagramRelations" "www.simantics.org/Documentation-1.2/DiagramRelations" + _ + @move"http://" "www.simantics.org/Documentation-1.1/Relations" "www.simantics.org/Documentation-1.2/Relations" + _ + @move"http://" "www.simantics.org/Documentation-1.1/Terminals" "www.simantics.org/Documentation-1.2/Terminals" + _ + @move"http://" "www.simantics.org/Documentation-1.1/Role" "www.semantum.fi/Simupedia-1.0/Role" + _ + @move"http://" "www.simantics.org/Documentation-1.1/RelationTypeConstraint" "www.simantics.org/Documentation-1.2/RelationTypeConstraint" + _ + @move"http://" "www.simantics.org/Documentation-1.1/Component" "www.semantum.fi/Simupedia-1.0/Components/Component" + _ + @move"http://" "www.simantics.org/Documentation-1.1/DocumentComponent" "www.simantics.org/Documentation-1.2/DocumentComponent" + _ + @move"http://" "www.simantics.org/Documentation-1.1/roleList" "www.semantum.fi/Simupedia-1.0/roleList" + _ + @move"http://" "www.simantics.org/Documentation-1.1/CommandConnectionType" "www.simantics.org/Documentation-1.2/CommandConnectionType" + _ + @move"http://" "www.simantics.org/Documentation-1.1/DataDefinitionConnectionType" "www.simantics.org/Documentation-1.2/DataDefinitionConnectionType" + _ + @move"http://" "www.simantics.org/Documentation-1.1/DataConnectionType" "www.simantics.org/Documentation-1.2/DataConnectionType" + _ + @move"http://" "www.simantics.org/Documentation-1.1/Functions" "www.semantum.fi/Simupedia-1.0/Functions" + _ + @move"http://" "www.simantics.org/Documentation-1.1/DocumentDiagram" "www.simantics.org/Documentation-1.2/DocumentDiagram" + _ + @move"http://" "www.simantics.org/Documentation-1.1/ConnectionType" "www.simantics.org/Documentation-1.2/ConnectionType" + _ + @move"http://" "www.simantics.org/Documentation-1.1/Document/IsConnectedToChild" "www.simantics.org/Documentation-1.2/Document/IsConnectedToChild" + _ + @move"http://" "www.simantics.org/Documentation-1.1/Document" "www.semantum.fi/Simupedia-1.0/Document" + _ + @move"http://" "www.simantics.org/Documentation-1.1" "www.simantics.org/Documentation-1.2" + _ + @move"http://" "www.simantics.org/DocumentWorkbench-1.0" "www.semantum.fi/SimupediaWorkbench-1.0" + + + _ @move"http://www.simantics.org/Document-" "1.1" "1.2" _ diff --git a/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph b/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph index 1ad68f5d..e5f34635 100644 --- a/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph +++ b/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph @@ -147,6 +147,12 @@ SYSDYN.Variable -- SYSDYN.Variable.equation - - - - + + @@ -787,7 +785,7 @@ @@ -972,10 +970,10 @@ @@ -989,10 +987,10 @@ @@ -1006,10 +1004,10 @@ @@ -2805,6 +2803,14 @@ type="radio" value="flow"> + diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Model.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Model.java index 90079b11..805f6e18 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Model.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/browser/contributions/Model.java @@ -57,7 +57,7 @@ public class Model extends ViewpointContributor { result.add(new ModulesNode(model.data)); result.add(new FunctionsFolder(model.data)); result.add(new ChartsFolder(model.data)); -// result.add(new SCLModulesFolder(model.data)); + result.add(new SCLModulesFolder(model.data)); return result; } diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/elements/LoopFactory.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/elements/LoopFactory.java index 0b83ef3f..473ee7a1 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/elements/LoopFactory.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/elements/LoopFactory.java @@ -282,8 +282,10 @@ public class LoopFactory extends SysdynElementFactory { Alignment alignment = Alignment.CENTER; name.setTransform(at2); - if(alignment != null) + if(alignment != null) { name.setHorizontalAlignment((byte) alignment.ordinal()); + name.setVerticalAlignment((byte) alignment.ordinal()); + } } } } @@ -295,7 +297,7 @@ public class LoopFactory extends SysdynElementFactory { private static double getYCoordShift(IElement e) { //String location = e.getHint(SysdynElementHints.KEY_LOCATION); - return 10.7; + return 9.7; } @Override diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/ArrayDependencyTab.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/ArrayDependencyTab.java index a94c8a14..bd1c1bfd 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/ArrayDependencyTab.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/ArrayDependencyTab.java @@ -33,7 +33,7 @@ import org.simantics.db.Resource; import org.simantics.db.WriteGraph; import org.simantics.db.exception.DatabaseException; import org.simantics.db.management.ISessionContext; -import org.simantics.jfreechart.chart.properties.LabelPropertyTabContributor; +import org.simantics.jfreechart.chart.properties.AdjustableTab; import org.simantics.sysdyn.SysdynResource; import org.simantics.sysdyn.ui.elements.connections.DependencyEdgeClass; import org.simantics.sysdyn.ui.elements.connections.DependencyNode; @@ -47,95 +47,18 @@ import org.simantics.utils.datastructures.Triple; * @author Tuomas Miettinen * */ -public class ArrayDependencyTab extends LabelPropertyTabContributor { +public class ArrayDependencyTab extends AdjustableTab { Button none, plus, minus, other, inside, outside; TrackedText polarityText, polarityLocationText; private DelayMarkWidget delayMark; private ArrowHeadWidget arrowhead; private Scale lineThicknessScale; - - @Override - public void createControls(Composite body, IWorkbenchSite site, ISessionContext context, WidgetSupport support) { - Composite composite = new Composite(body, SWT.NONE); - GridDataFactory.fillDefaults().grab(true, true).applyTo(composite); - GridLayoutFactory.fillDefaults().margins(3, 3).numColumns(2).applyTo(composite); - - /* Add a dummy button at the begin to suck in the nonsense selection events that - * the first radio button in the group of ALL the radio buttons receives when no - * radio is selected and then one is selected in other group than where the first - * radio button lies. - */ - Group hiddenDefaultbuttonGroup = new Group(composite, SWT.NONE); - GridDataFactory.fillDefaults().exclude(true).applyTo(hiddenDefaultbuttonGroup); - GridLayoutFactory.fillDefaults().applyTo(hiddenDefaultbuttonGroup); - new Button(hiddenDefaultbuttonGroup, support, SWT.RADIO); - - Group polarityGroup = new Group(composite, SWT.NONE); - polarityGroup.setText("Polarity"); - GridDataFactory.fillDefaults().grab(true, false).applyTo(polarityGroup); - GridLayoutFactory.fillDefaults().numColumns(5).applyTo(polarityGroup); - - none = new Button(polarityGroup, support, SWT.RADIO); - none.setText("None"); - none.setSelectionFactory(new PolarityRadioSelectionFactory("")); - none.addSelectionListener(new PolaritySelectionListener(context, "")); - - plus = new Button(polarityGroup, support, SWT.RADIO); - plus.setText("+"); - plus.setSelectionFactory(new PolarityRadioSelectionFactory("+")); - plus.addSelectionListener(new PolaritySelectionListener(context, "+")); - - minus = new Button(polarityGroup, support, SWT.RADIO); - minus.setText("-"); - minus.setSelectionFactory(new PolarityRadioSelectionFactory("-")); - minus.addSelectionListener(new PolaritySelectionListener(context, "-")); - - other = new Button(polarityGroup, support, SWT.RADIO); - other.setText("other"); - other.setSelectionFactory(new OtherPolaritySelectionFactory(new String[] {null, "+", "-", ""})); - - polarityText = new TrackedText(polarityGroup, support, SWT.BORDER); - polarityText.setTextFactory(new OtherPolarityStringPropertyFactory()); - polarityText.addModifyListener(new OtherPolarityStringPropertyModifier()); - GridDataFactory.fillDefaults().grab(true, false).applyTo(polarityText.getWidget()); - - Group locationGroup = new Group(composite, SWT.NONE); - GridDataFactory.fillDefaults().applyTo(locationGroup); - GridLayoutFactory.fillDefaults().applyTo(locationGroup); - locationGroup.setText("Location"); - - inside = new Button(locationGroup, support, SWT.RADIO); - inside.setText("Inside"); - inside.setSelectionFactory(new PolarityLocationRadioSelectionFactory(DependencyNode.INSIDE)); - inside.addSelectionListener(new PolarityLocationSelectionListener(context, DependencyNode.INSIDE)); - - outside = new Button(locationGroup, support, SWT.RADIO); - outside.setText("Outside"); - outside.setSelectionFactory(new PolarityLocationRadioSelectionFactory(DependencyNode.OUTSIDE)); - outside.addSelectionListener(new PolarityLocationSelectionListener(context, DependencyNode.OUTSIDE)); - - Composite misc = new Composite(composite, SWT.NONE); - GridDataFactory.fillDefaults().grab(true, true).applyTo(misc); - GridLayoutFactory.fillDefaults().numColumns(3).applyTo(misc); - - arrowhead = new ArrowHeadWidget(misc, support, SWT.NULL); - GridDataFactory.fillDefaults().applyTo(arrowhead.getWidget()); - delayMark = new DelayMarkWidget(misc, support, SWT.NULL); - GridDataFactory.fillDefaults().applyTo(delayMark.getWidget()); - - Group lineThicknessGroup = new Group(misc, SWT.NONE); - GridDataFactory.fillDefaults().applyTo(lineThicknessGroup); - GridLayoutFactory.fillDefaults().applyTo(lineThicknessGroup); - lineThicknessGroup.setText("Line thickness:"); - lineThicknessScale = new Scale(lineThicknessGroup, support, SWT.HORIZONTAL); - lineThicknessScale.getWidget().setMinimum(1); - lineThicknessScale.getWidget().setMaximum(15); - lineThicknessScale.getWidget().setPageIncrement(1); - lineThicknessScale.getWidget().setIncrement(1); - lineThicknessScale.setSelectionFactory(new LineThicknessRadioSelectionFactory()); - lineThicknessScale.addSelectionListener(new LineThicknessSelectionListener(context, lineThicknessScale)); - } + private Group hiddenDefaultbuttonGroup; + private Group polarityGroup; + private Group locationGroup; + private Composite misc; + private Group lineThicknessGroup; class LineThicknessSelectionListener extends SelectionListenerImpl> { Scale scale; @@ -345,4 +268,124 @@ public class ArrayDependencyTab extends LabelPropertyTabContributor { } } + @Override + protected void createAndAddControls(Composite body, IWorkbenchSite site, + ISessionContext context, WidgetSupport support) { + composite = new Composite(body, SWT.NONE); + + /* Add a dummy button at the begin to suck in the nonsense selection events that + * the first radio button in the group of ALL the radio buttons receives when no + * radio is selected and then one is selected in other group than where the first + * radio button lies. + */ + hiddenDefaultbuttonGroup = new Group(composite, SWT.NONE); + new Button(hiddenDefaultbuttonGroup, support, SWT.RADIO); + + polarityGroup = new Group(composite, SWT.NONE); + polarityGroup.setText("Polarity"); + + none = new Button(polarityGroup, support, SWT.RADIO); + none.setText("None"); + none.setSelectionFactory(new PolarityRadioSelectionFactory("")); + none.addSelectionListener(new PolaritySelectionListener(context, "")); + + plus = new Button(polarityGroup, support, SWT.RADIO); + plus.setText("+"); + plus.setSelectionFactory(new PolarityRadioSelectionFactory("+")); + plus.addSelectionListener(new PolaritySelectionListener(context, "+")); + + minus = new Button(polarityGroup, support, SWT.RADIO); + minus.setText("-"); + minus.setSelectionFactory(new PolarityRadioSelectionFactory("-")); + minus.addSelectionListener(new PolaritySelectionListener(context, "-")); + + other = new Button(polarityGroup, support, SWT.RADIO); + other.setText("other"); + other.setSelectionFactory(new OtherPolaritySelectionFactory(new String[] {null, "+", "-", ""})); + + polarityText = new TrackedText(polarityGroup, support, SWT.BORDER); + polarityText.setTextFactory(new OtherPolarityStringPropertyFactory()); + polarityText.addModifyListener(new OtherPolarityStringPropertyModifier()); + + locationGroup = new Group(composite, SWT.NONE); + locationGroup.setText("Location"); + + inside = new Button(locationGroup, support, SWT.RADIO); + inside.setText("Inside"); + inside.setSelectionFactory(new PolarityLocationRadioSelectionFactory(DependencyNode.INSIDE)); + inside.addSelectionListener(new PolarityLocationSelectionListener(context, DependencyNode.INSIDE)); + + outside = new Button(locationGroup, support, SWT.RADIO); + outside.setText("Outside"); + outside.setSelectionFactory(new PolarityLocationRadioSelectionFactory(DependencyNode.OUTSIDE)); + outside.addSelectionListener(new PolarityLocationSelectionListener(context, DependencyNode.OUTSIDE)); + + misc = new Composite(composite, SWT.NONE); + + arrowhead = new ArrowHeadWidget(misc, support, SWT.NULL); + delayMark = new DelayMarkWidget(misc, support, SWT.NULL); + + lineThicknessGroup = new Group(misc, SWT.NONE); + lineThicknessGroup.setText("Line thickness:"); + lineThicknessScale = new Scale(lineThicknessGroup, support, SWT.HORIZONTAL); + lineThicknessScale.getWidget().setMinimum(1); + lineThicknessScale.getWidget().setMaximum(15); + lineThicknessScale.getWidget().setPageIncrement(1); + lineThicknessScale.getWidget().setIncrement(1); + lineThicknessScale.setSelectionFactory(new LineThicknessRadioSelectionFactory()); + lineThicknessScale.addSelectionListener(new LineThicknessSelectionListener(context, lineThicknessScale)); + } + + @Override + protected void createControlLayoutVertical() { + GridDataFactory.fillDefaults().grab(true, true).applyTo(composite); + GridLayoutFactory.fillDefaults().margins(3, 3).numColumns(1).applyTo(composite); + + GridDataFactory.fillDefaults().exclude(true).applyTo(hiddenDefaultbuttonGroup); + GridLayoutFactory.fillDefaults().applyTo(hiddenDefaultbuttonGroup); + + GridDataFactory.fillDefaults().grab(true, false).applyTo(polarityGroup); + GridLayoutFactory.fillDefaults().numColumns(5).applyTo(polarityGroup); + + GridDataFactory.fillDefaults().grab(true, false).applyTo(polarityText.getWidget()); + + GridDataFactory.fillDefaults().applyTo(locationGroup); + GridLayoutFactory.fillDefaults().applyTo(locationGroup); + + GridDataFactory.fillDefaults().grab(true, true).applyTo(misc); + GridLayoutFactory.fillDefaults().numColumns(2).applyTo(misc); + + GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.BEGINNING).applyTo(arrowhead.getWidget()); + GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.BEGINNING).applyTo(delayMark.getWidget()); + + GridDataFactory.fillDefaults().span(2, 1).applyTo(lineThicknessGroup); + GridLayoutFactory.fillDefaults().applyTo(lineThicknessGroup); + } + + @Override + protected void createControlLayoutHorizontal(boolean wideScreen) { + GridDataFactory.fillDefaults().grab(true, true).applyTo(composite); + GridLayoutFactory.fillDefaults().margins(3, 3).numColumns(2).applyTo(composite); + + GridDataFactory.fillDefaults().exclude(true).applyTo(hiddenDefaultbuttonGroup); + GridLayoutFactory.fillDefaults().applyTo(hiddenDefaultbuttonGroup); + + GridDataFactory.fillDefaults().grab(true, false).applyTo(polarityGroup); + GridLayoutFactory.fillDefaults().numColumns(5).applyTo(polarityGroup); + + GridDataFactory.fillDefaults().grab(true, false).applyTo(polarityText.getWidget()); + + GridDataFactory.fillDefaults().applyTo(locationGroup); + GridLayoutFactory.fillDefaults().applyTo(locationGroup); + + GridDataFactory.fillDefaults().grab(true, true).applyTo(misc); + GridLayoutFactory.fillDefaults().numColumns(3).applyTo(misc); + + GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.BEGINNING).applyTo(arrowhead.getWidget()); + GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.BEGINNING).applyTo(delayMark.getWidget()); + + GridDataFactory.fillDefaults().span(1, 1).applyTo(lineThicknessGroup); + GridLayoutFactory.fillDefaults().applyTo(lineThicknessGroup); + } + } diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/CommentTab.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/CommentTab.java index 3d7183e6..0b6c00c1 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/CommentTab.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/CommentTab.java @@ -25,7 +25,6 @@ import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupport; import org.simantics.db.management.ISessionContext; import org.simantics.diagram.stubs.DiagramResource; import org.simantics.jfreechart.chart.properties.LabelPropertyTabContributor; -import org.simantics.utils.datastructures.Callback; /** * Tab for editing diagram comments @@ -35,10 +34,10 @@ import org.simantics.utils.datastructures.Callback; */ public class CommentTab extends LabelPropertyTabContributor { - @Override - public void updatePartName(ISelection forSelection, final Callback updateCallback) { - updateCallback.run("Comment"); - } + @Override + public String getPartName(ISelection forSelection) { + return "Comment"; + } @Override public void createControls(Composite body, IWorkbenchSite site, ISessionContext context, WidgetSupport support) { diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/ConfigurationTab.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/ConfigurationTab.java index afee67e9..33ad0ea6 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/ConfigurationTab.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/ConfigurationTab.java @@ -60,7 +60,6 @@ import org.simantics.sysdyn.ui.properties.widgets.factories.ModelNameInputValida public class ConfigurationTab extends AdjustableTab { private ScrolledComposite sc; - private Composite composite; private Label nameLabel, startTimeLabel, stopTimeLabel, stepLengthLabel, outputIntervalLabel, methodLabel, toleranceLabel, variableFilterLabel; private TrackedText name, startTime, stopTime, stepLength, outputInterval, tolerance, variableFilter; @@ -279,7 +278,9 @@ public class ConfigurationTab extends AdjustableTab { "To include variables Auxiliary1, Auxiliary2 and Auxiliary3: \n" + "Auxiliary[1-3]\n" + "or\n" + - "Auxiliary1|Auxiliary2|Auxiliary3"); + "Auxiliary1|Auxiliary2|Auxiliary3\n" + + "NOTE: whitespace must be replaced with an underscore ('_') character" + + "e.g. 'Growth Rate' -> 'Growth_Rate'"); variableFilter = new TrackedText(composite, support, SWT.BORDER); variableFilter.setTextFactory(new StringPropertyFactory(SysdynResource.URIs.SysdynModel_variableFilter, "")); @@ -288,7 +289,9 @@ public class ConfigurationTab extends AdjustableTab { "To include variables Auxiliary1, Auxiliary2 and Auxiliary3: \n" + "Auxiliary[1-3]\n" + "or\n" + - "Auxiliary1|Auxiliary2|Auxiliary3"); + "Auxiliary1|Auxiliary2|Auxiliary3\n" + + "NOTE: whitespace must be replaced with an underscore ('_') character" + + "e.g. 'Growth Rate' -> 'Growth_Rate'"); sc.setExpandHorizontal(true); sc.setExpandVertical(true); diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/DependencyTab.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/DependencyTab.java index 6cb813fa..1acc0212 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/DependencyTab.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/DependencyTab.java @@ -55,7 +55,6 @@ public class DependencyTab extends AdjustableTab { Scale lineThicknessScale; private DelayMarkWidget delayMark; private ArrowHeadWidget arrowhead; - private Composite composite; private Group polarityGroup; private Group locationGroup; private Composite misc; diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/EquationTab.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/EquationTab.java index c022808d..633cdfa3 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/EquationTab.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/EquationTab.java @@ -98,7 +98,6 @@ public class EquationTab extends AdjustableTab implements Widget { private WidgetSupportImpl support; private ExpressionComposite expressionComposite; private final WidgetSupportImpl expressionSupport = new WidgetSupportImpl(); - private Composite composite; private Composite nameComposite; private Composite TypeAndUnit; private Label typeLabel; diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/FunctionTab.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/FunctionTab.java index de7994be..c20ede21 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/FunctionTab.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/FunctionTab.java @@ -33,7 +33,6 @@ import org.simantics.sysdyn.ui.properties.widgets.functions.FunctionCodeWidget; public class FunctionTab extends AdjustableTab { ExpressionField modelicaCode; - private Composite composite; private TrackedText nameText; private Group modelicaGroup; private Label startLabel; diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/LoopTab.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/LoopTab.java index cc4bd43d..ee43cbb4 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/LoopTab.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/LoopTab.java @@ -60,7 +60,7 @@ public class LoopTab extends AdjustableTab { private TrackedCombo loopItemsDropdown; Button auto, balancing, reinforcing, other, inside, outside; TrackedText loopComment, polarityLocationText; - Composite composite, loopItems; + Composite loopItems; Group commentGroup, rotationGroup; protected Resource resource; public static final String AUTO = "$$AUTO$$"; diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/ResourceSelectionProcessor.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/ResourceSelectionProcessor.java index 1fb36162..49407d6b 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/ResourceSelectionProcessor.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/ResourceSelectionProcessor.java @@ -32,6 +32,7 @@ import org.simantics.db.layer0.request.PossibleActiveVariableFromVariable; import org.simantics.db.layer0.variable.Variable; import org.simantics.diagram.stubs.DiagramResource; import org.simantics.jfreechart.ChartSelectionTabContributor; +import org.simantics.jfreechart.chart.properties.ChartTab; import org.simantics.jfreechart.chart.properties.xyline.XYLineGeneralPropertiesTab; import org.simantics.layer0.Layer0; import org.simantics.modeling.ModelingResources; @@ -527,6 +528,11 @@ public class ResourceSelectionProcessor implements SelectionProcessor> contentListener; - private RemoveFocusBeforeExperimentComposite composite; private Composite labelComposite; private Label labelName; private Label labelNumber; diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/VariableInformationTab.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/VariableInformationTab.java index c5b18516..2e4fc801 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/VariableInformationTab.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/VariableInformationTab.java @@ -86,7 +86,6 @@ public class VariableInformationTab extends AdjustableTab implements Widget { } private Read> fontAndColorRead; - private Composite composite; private Group informationGroup; private TrackedText information; private Group rangeGroup; diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/CustomFontDialog.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/CustomFontDialog.java index 51bcf324..8bf97ce6 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/CustomFontDialog.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/widgets/CustomFontDialog.java @@ -19,6 +19,8 @@ import java.util.Map; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.resource.FontDescriptor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.resource.LocalResourceManager; @@ -38,6 +40,8 @@ import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; +import org.simantics.sysdyn.ui.Activator; +import org.simantics.sysdyn.ui.preferences.SysdynDiagramPreferences; import org.simantics.utils.ui.gfx.ColorImageDescriptor; /** @@ -345,6 +349,20 @@ public class CustomFontDialog extends Dialog { int code; RGB color; Display display = Display.getCurrent(); + + //IWorkbenchPage iwp = SysdynWorkbenchUtils.getActivePageOfEditor(); + //final ICanvasContext context = (ICanvasContext)iwp.getActiveEditor().getAdapter(ICanvasContext.class); + + IPreferenceStore store = Activator.getDefault().getPreferenceStore(); + color = PreferenceConverter.getColor(store, SysdynDiagramPreferences.ARROW_COLOR); + image = resourceManager.createImage(new ColorImageDescriptor(color.red, color.green, color.blue, 25, 15, false)); + + ti = new TableItem(table, SWT.NONE); + ti.setImage(0, image); + ti.setText(1, "Default Arrow"); + ti.setForeground(display.getSystemColor(SWT.COLOR_BLACK)); + ti.setData(color); + for(String text : systemColors.keySet()) { code = systemColors.get(text); color = display.getSystemColor(code).getRGB(); diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/SensitivityChartAxisAndVariablesTab.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/SensitivityChartAxisAndVariablesTab.java index 2f957146..ab53b0f8 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/SensitivityChartAxisAndVariablesTab.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/trend/SensitivityChartAxisAndVariablesTab.java @@ -47,7 +47,6 @@ public class SensitivityChartAxisAndVariablesTab extends AdjustableTab { private GraphExplorerComposite explorer; private ScrolledComposite propertyContainer; private WidgetSupportImpl additionalSupport; - private Composite composite; public SensitivityChartAxisAndVariablesTab() { additionalSupport = new WidgetSupportImpl(); @@ -111,8 +110,6 @@ public class SensitivityChartAxisAndVariablesTab extends AdjustableTab { protected void createAndAddControls(Composite body, IWorkbenchSite site, final ISessionContext context, WidgetSupport support) { composite = new Composite(body, SWT.NONE); - GridDataFactory.fillDefaults().grab(true, true).applyTo(composite); - GridLayoutFactory.fillDefaults().numColumns(2).margins(3, 3).applyTo(composite); // (Ontology-based) GraphExplorer displaying range axis and variables mapped to those axis explorer = new AxisAndVariablesExplorerComposite(ArrayMap.keys( @@ -128,12 +125,9 @@ public class SensitivityChartAxisAndVariablesTab extends AdjustableTab { updateSelection(context); } }); - GridDataFactory.fillDefaults().hint(250, SWT.DEFAULT).grab(false, true).applyTo(explorer); // Scrolled composite for displaying properties of a selection in explorer propertyContainer = new ScrolledComposite(composite, SWT.H_SCROLL | SWT.V_SCROLL); - GridDataFactory.fillDefaults().span(1, 2).grab(true, true).applyTo(propertyContainer); - GridLayoutFactory.fillDefaults().applyTo(propertyContainer); propertyContainer.setExpandHorizontal(true); propertyContainer.setExpandVertical(true); diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ArrayVariableUtils.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ArrayVariableUtils.java index d6f024e1..73663c77 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ArrayVariableUtils.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/utils/ArrayVariableUtils.java @@ -1,3 +1,14 @@ +/******************************************************************************* + * Copyright (c) 2010, 2014 Association for Decentralized Information Management in + * Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ package org.simantics.sysdyn.ui.utils; import java.util.ArrayList; @@ -59,74 +70,91 @@ public class ArrayVariableUtils { result.put(elements.length > 0 ? elements.length - 1 : 0, error); } - for(int i = 0; i < elements.length && i < enumerations.size(); i++) { - if(elements[i].trim().equals(":")) - continue; - if(elements[i].indexOf(":") != elements[i].lastIndexOf(":")) { + String trimmedElement = elements[i].trim(); + if (trimmedElement.charAt(0) == '{' && trimmedElement.charAt(trimmedElement.length() - 1) == '}') { + // Something like "{a, b, c}" + String[] rangeComponents = trimmedElement.substring(1, trimmedElement.length() - 1).split(","); + // Single range component, equals to the enumeration at that index + if(rangeComponents.length == 1 && rangeComponents[0].trim().equals(enumerations.get(i).getName())) + continue; + // more than one range component, they all equal to individual indexes in the enumeration + result.putAll(areRangeComponentsValid(rangeComponents, enumerations, i)); + } else if(trimmedElement.equals(":")) { + continue; // Just a ":" + } else if(elements[i].indexOf(":") != elements[i].lastIndexOf(":")) { + // Something like "a : b : c" error = new SyntaxError(); error.setMessage( "Too many ':' elements"); error.setType(ExpressionField.SYNTAX_ERROR); result.put(i, error); continue; + } else { + // Something like "a : c" OR "a" + String[] rangeComponents = elements[i].split(":"); + if(rangeComponents.length > 2){ + error = new SyntaxError(); + error.setMessage( "Too many ':' elements"); + error.setType(ExpressionField.SYNTAX_ERROR); + result.put(i, error); + continue; + } + // Single range component, equals to the enumeration at that index + if(rangeComponents.length == 1 && rangeComponents[0].trim().equals(enumerations.get(i).getName())) + continue; + // one or two range components, they all equal to individual indexes in the enumeration + result.putAll(areRangeComponentsValid(rangeComponents, enumerations, i)); } + } + if(result.isEmpty()) + return null; + else + return result; + } - String[] rangeComponents = elements[i].split(":"); - if(rangeComponents.length > 2){ - error = new SyntaxError(); - error.setMessage( "Too many ':' elements"); - error.setType(ExpressionField.SYNTAX_ERROR); - result.put(i, error); - continue; + private static Map areRangeComponentsValid(String[] rangeComponents, ArrayList enumerations, int i) { + SyntaxError error; + Map result = new HashMap(); + for(String r : rangeComponents) { + r = r.trim(); + boolean componentIsValid = false; + Enumeration enumeration = enumerations.get(i); + for(EnumerationIndex ei : enumeration.getEnumerationIndexes()) { + if(ei.getName().equals(r)) { + componentIsValid = true; + break; + } } - // Single range component, equals to the enumeration at that index - if(rangeComponents.length == 1 && rangeComponents[0].trim().equals(enumerations.get(i).getName())) - continue; - // one or two range components, they all equal to individual indexes in the enumeration - for(String r : rangeComponents) { - r = r.trim(); - boolean componentIsValid = false; - Enumeration enumeration = enumerations.get(i); - for(EnumerationIndex ei : enumeration.getEnumerationIndexes()) { - if(ei.getName().equals(r)) { + if(!componentIsValid && r.length() > 0) { + // Check if the range is an integer that is between 0 and enumeration indexes size + try { + int index = Integer.parseInt(r); + int min = 1; + int max = enumeration.getEnumerationIndexes().size(); + if(index >= min && index <= max || enumeration.isReplaceable()) { componentIsValid = true; - break; - } - } - if(!componentIsValid && r.length() > 0) { - // Check if the range is an integer that is between 0 and enumeration indexes size - try { - int index = Integer.parseInt(r); - int min = 1; - int max = enumeration.getEnumerationIndexes().size(); - if(index >= min && index <= max || enumeration.isReplaceable()) { - componentIsValid = true; - error = new SyntaxError(); - error.setMessage("Using numbers as array indexes is not encouraged"); - error.setType(ExpressionField.SYNTAX_WARNING); - result.put(i, error); - } else { - error = new SyntaxError(); - error.setMessage("Invalid array index " + index + ". Numbered index must be between " + min + " and " + max); - error.setType(ExpressionField.SYNTAX_ERROR); - result.put(i, error); - } - } catch (NumberFormatException e) { error = new SyntaxError(); - error.setMessage("Invalid range"); + error.setMessage("Using numbers as array indexes is not encouraged"); + error.setType(ExpressionField.SYNTAX_WARNING); + result.put(i, error); + } else { + error = new SyntaxError(); + error.setMessage("Invalid array index " + index + ". Numbered index must be between " + min + " and " + max); error.setType(ExpressionField.SYNTAX_ERROR); result.put(i, error); } + } catch (NumberFormatException e) { + error = new SyntaxError(); + error.setMessage("Invalid range"); + error.setType(ExpressionField.SYNTAX_ERROR); + result.put(i, error); } } } - if(result.isEmpty()) - return null; - else - return result; - } + return result; + } - /** + /** * Checks if the given range can be applied to the given variable. * * @param graph ReadGraph @@ -139,13 +167,30 @@ public class ArrayVariableUtils { if(variable == null) return true; String[] elements = range.split(","); + // Connect arrays, e.g. {a,b,c} + ArrayList connectedElements = new ArrayList(); + for (int i = 0; i < elements.length; ++i) { + String lastElement = elements[i]; + String fullElement = new String(); + if (lastElement.length() > 0 && lastElement.charAt(0) == '{') { + while (lastElement.charAt(lastElement.length() - 1) != '}' && i < elements.length - 1) { + fullElement += lastElement + ","; + ++i; + lastElement = elements[i]; + } + } + fullElement += lastElement; + connectedElements.add(fullElement); + } + String fullElements[] = connectedElements.toArray(new String[connectedElements.size()]); + SysdynModel model = ModelUtils.getModel(graph, variable); if(model == null) return false; IElement e = model.getElement(variable); if(e != null && e instanceof Variable) { Variable v = (Variable) e; - if(isRangeValid(graph, v, elements) == null) + if(isRangeValid(graph, v, fullElements) == null) return true; else return false; diff --git a/org.simantics.sysdyn/adapters.xml b/org.simantics.sysdyn/adapters.xml index 509cd5ea..c01c1f80 100644 --- a/org.simantics.sysdyn/adapters.xml +++ b/org.simantics.sysdyn/adapters.xml @@ -97,5 +97,13 @@ adapterClass="org.simantics.sysdyn.adapter.RunVariableAdapter"/> --> + + + + + \ No newline at end of file diff --git a/org.simantics.sysdyn/scl/Sysdyn.scl b/org.simantics.sysdyn/scl/Sysdyn.scl index b32a845a..148fe0fb 100644 --- a/org.simantics.sysdyn/scl/Sysdyn.scl +++ b/org.simantics.sysdyn/scl/Sysdyn.scl @@ -91,6 +91,8 @@ importJava "org.simantics.sysdyn.utils.DocumentationUtils" where isParameter :: Variable -> Boolean lastValue :: Resource -> String -> String -> Double + lastValue2 :: Variable -> String -> Variable + equation :: Variable -> String -> Variable importJava "org.simantics.sysdyn.manager.SysdynExperiments" where diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/Functions.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/Functions.java index 002925aa..04c2b623 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/Functions.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/Functions.java @@ -1,14 +1,18 @@ package org.simantics.sysdyn; +import java.util.Collection; import java.util.HashMap; import java.util.Map; +import org.simantics.databoard.Bindings; import org.simantics.databoard.binding.Binding; +import org.simantics.databoard.binding.mutable.Variant; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.WriteGraph; import org.simantics.db.common.request.ResourceRead; import org.simantics.db.common.uri.UnescapedChildMapOfResource; +import org.simantics.db.common.utils.ListUtils; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.function.All; import org.simantics.db.layer0.variable.StandardGraphChildVariable; @@ -25,6 +29,7 @@ import org.simantics.sysdyn.adapter.NamesIndexVariable; import org.simantics.sysdyn.adapter.TimeIndexVariable; import org.simantics.sysdyn.adapter.TimesIndexVariable; import org.simantics.sysdyn.adapter.ValueIndexVariable; +import org.simantics.sysdyn.adapter.ValueIndexVariableI; import org.simantics.sysdyn.adapter.ValuesIndexVariable; public class Functions { @@ -68,6 +73,68 @@ public class Functions { } }; + + @SCLValue(type = "ValueAccessor") + public static ValueAccessor equationPropertyValue = new ValueAccessor() { + + @Override + public Object getValue(ReadGraph graph, Variable context) throws DatabaseException { + return getValue(graph, context, Bindings.STRING); + } + + @Override + public Object getValue(ReadGraph graph, Variable context, Binding binding) throws DatabaseException { + + Variable v = context.getParent(graph); + + Resource represents = v.getPossibleRepresents(graph); + if(represents != null) { + SysdynResource SYSDYN = SysdynResource.getInstance(graph); + Collection res = ListUtils.toList(graph, graph.getSingleObject(represents, SYSDYN.Variable_expressionList)); + if(res.size() == 1) { + Resource exp = res.iterator().next(); + String text = graph.getRelatedValue(exp, SYSDYN.Expression_equation, Bindings.STRING); + return text; + } + } + + return null; + + } + + @Override + public void setValue(WriteGraph graph, Variable context, Object value) throws DatabaseException { + + if(value instanceof Variant) value = ((Variant)value).getValue(); + + if(!(value instanceof String)) throw new DatabaseException("Unexpected value " + value + ", expected String"); + + setValue(graph, context, value, Bindings.STRING); + + } + + @Override + public void setValue(WriteGraph graph, Variable context, Object value, Binding binding) throws DatabaseException { + + if(value instanceof Variant) value = ((Variant)value).getValue(); + + if(!(value instanceof String)) throw new DatabaseException("Unexpected value " + value + ", expected String"); + + Variable v = context.getParent(graph); + + Resource represents = v.getPossibleRepresents(graph); + if(represents != null) { + SysdynResource SYSDYN = SysdynResource.getInstance(graph); + Collection res = ListUtils.toList(graph, graph.getSingleObject(represents, SYSDYN.Variable_expressionList)); + if(res.size() == 1) { + Resource exp = res.iterator().next(); + graph.claimLiteral(exp, SYSDYN.Expression_equation, value, Bindings.STRING); + } + } + + } + + }; @SCLValue(type = "VariableMap") @@ -97,7 +164,12 @@ public class Functions { String property = context.getName(graph); if(VALUE.equals(property)) - return new ValueIndexVariable(graph, context, name); + if(name.startsWith("$")) { + Integer index = Integer.parseInt(name.substring(1)); + return new ValueIndexVariableI(graph, context, index); + } else { + return new ValueIndexVariable(graph, context, name); + } else if(VALUES.equals(property)) return new ValuesIndexVariable(graph, context, name); else if(TIMES.equals(property)) diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/CustomMigrationStep.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/CustomMigrationStep.java new file mode 100644 index 00000000..dce49fa4 --- /dev/null +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/CustomMigrationStep.java @@ -0,0 +1,58 @@ +package org.simantics.sysdyn.adapter; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.simantics.db.Resource; +import org.simantics.db.Session; +import org.simantics.db.WriteGraph; +import org.simantics.db.common.request.ObjectsWithType; +import org.simantics.db.common.request.WriteRequest; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.migration.MigrationState; +import org.simantics.db.layer0.migration.MigrationStateKeys; +import org.simantics.db.layer0.migration.MigrationStep; +import org.simantics.db.layer0.util.Layer0Utils; +import org.simantics.layer0.Layer0; +import org.simantics.layer0.utils.direct.GraphUtils; +import org.simantics.simulation.ontology.SimulationResource; +import org.simantics.spreadsheet.resource.SpreadsheetResource; + +public class CustomMigrationStep implements MigrationStep { + + @Override + public void applyTo(IProgressMonitor monitor, Session session, MigrationState state) throws DatabaseException { + + final Resource res = state.getProperty(MigrationStateKeys.CURRENT_RESOURCE); + + session.syncRequest(new WriteRequest() { + + @Override + public void perform(WriteGraph graph) throws DatabaseException { + + Layer0 l0 = Layer0.getInstance(graph); + SimulationResource SIMU = SimulationResource.getInstance(graph); + + for(Resource model : graph.syncRequest(new ObjectsWithType(res, l0.ConsistsOf, SIMU.Model))) { + + Resource sheetExperiment = Layer0Utils.getPossibleChild(graph, model, "SheetExperiment"); + if(sheetExperiment != null) return; + + SpreadsheetResource SHEET = SpreadsheetResource.getInstance(graph); + sheetExperiment = GraphUtils.create2(graph, SHEET.Experiment, + l0.HasName, "SheetExperiment", + l0.HasLabel, "Sheet Experiment", + l0.PartOf, model); + + Resource sheetRun = GraphUtils.create2(graph, SHEET.Run, + l0.HasName, "Default", + l0.PartOf, sheetExperiment); + + + } + + } + + }); + + } + +} diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/ValueIndexVariable.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/ValueIndexVariable.java index 71ea423e..3b05dd71 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/ValueIndexVariable.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/ValueIndexVariable.java @@ -1,111 +1,19 @@ package org.simantics.sysdyn.adapter; -import java.util.ArrayList; -import java.util.Collection; - import org.simantics.db.ReadGraph; -import org.simantics.db.Resource; -import org.simantics.db.WriteGraph; -import org.simantics.db.common.utils.NameUtils; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.variable.Variable; -import org.simantics.fmu.FMUControlJNI; -import org.simantics.fmu.FMUJNIException; -import org.simantics.simulation.experiment.ExperimentState; -import org.simantics.sysdyn.SysdynResource; -import org.simantics.sysdyn.manager.SysdynDataSet; -import org.simantics.sysdyn.manager.SysdynGameExperiment; -import org.simantics.sysdyn.manager.SysdynResult; -public class ValueIndexVariable extends IndexVariable { +public class ValueIndexVariable extends ValueIndexVariableBase { public ValueIndexVariable(ReadGraph graph, Variable parent, String indexes) throws DatabaseException { super(graph, parent, indexes); } - - public static double[] UNRESOLVED = new double[0]; @Override public double[] getValue() { - if(experiment == null) - return UNRESOLVED; - - Collection results = experiment.getActiveResults(); - ArrayList variableNames = getVariableNamesWithIndexNumbers(); - - double[] result = new double[variableNames.size()]; - for(int i = 0; i < variableNames.size(); i++) { - for(SysdynResult r : results) { - if(experiment instanceof SysdynGameExperiment) { - Double d = ((SysdynGameExperiment)experiment).getCurrentValue(variableNames.get(i)); - result[i] = d != null ? d : 0; - } else { - SysdynDataSet ds = r.getDataSet(variableNames.get(i)); - if(ds != null && ds.values != null && ds.values.length > 0) { - result[i] = ds.values[ds.values.length-1]; - } else { - return UNRESOLVED; - } - } - } - } - return result; + return getValueFull(); } - - @Override - public void setIndexedValue(WriteGraph graph, Object value) - throws DatabaseException { - Variable var = parent.getParent(graph); - Resource resource = var.getRepresents(graph); - - if(!(value instanceof double[]) || resource == null) - return; - - double[] values = (double[]) value; - - FMUControlJNI control = null; - if(experiment instanceof SysdynGameExperiment) { // Support only game experiments for now.. - - SysdynGameExperiment exp = (SysdynGameExperiment)experiment; - ExperimentState state = exp.getSysdynExperimentState(); - // Set value to control only if the simulation is running or stopped, not before initialization - if(!(ExperimentState.RUNNING.equals(state) || ExperimentState.STOPPED.equals(state))) - return; - - control = ((SysdynGameExperiment)this.experiment).getFMUControl(); - if(control == null) - return; - - - - ArrayList variableNames = getVariableNamesWithIndexNumbers(); - for(int i = 0; i < variableNames.size() && i < values.length; i++) { - if(values[i] == Double.NaN) - continue; - - try { - String name = variableNames.get(i); - control.setRealValue(name, values[i]); - - // Set value for all referred variables in modules - SysdynResource sr = SysdynResource.getInstance(graph); - for(Resource dependency : graph.getObjects(resource, sr.Variable_isTailOf)) { - Resource head = graph.getPossibleObject(dependency, sr.Variable_HasHead); - Resource ref = graph.getPossibleObject(dependency, sr.Dependency_refersTo); - if(ref != null && head != null) { - String module = ""; - if(name.indexOf(".") > 0) - module = name.substring(0, name.lastIndexOf(".") + 1); - String refName = module + NameUtils.getSafeName(graph, head) + "." + NameUtils.getSafeName(graph, ref); - control.setRealValue(refName, values[i]); - } - } - } catch (FMUJNIException e) { - } - } - exp.updateSubscriptions(); - } - } - + } diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/ValueIndexVariableBase.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/ValueIndexVariableBase.java new file mode 100644 index 00000000..83bfbba8 --- /dev/null +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/ValueIndexVariableBase.java @@ -0,0 +1,110 @@ +package org.simantics.sysdyn.adapter; + +import java.util.ArrayList; +import java.util.Collection; + +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; +import org.simantics.db.common.utils.NameUtils; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.variable.Variable; +import org.simantics.fmu.FMUControlJNI; +import org.simantics.fmu.FMUJNIException; +import org.simantics.simulation.experiment.ExperimentState; +import org.simantics.sysdyn.SysdynResource; +import org.simantics.sysdyn.manager.SysdynDataSet; +import org.simantics.sysdyn.manager.SysdynGameExperiment; +import org.simantics.sysdyn.manager.SysdynResult; + +abstract public class ValueIndexVariableBase extends IndexVariable { + + public ValueIndexVariableBase(ReadGraph graph, Variable parent, String indexes) + throws DatabaseException { + super(graph, parent, indexes); + } + + public static double[] UNRESOLVED = new double[0]; + + public double[] getValueFull() { + if(experiment == null) + return UNRESOLVED; + + Collection results = experiment.getActiveResults(); + ArrayList variableNames = getVariableNamesWithIndexNumbers(); + + double[] result = new double[variableNames.size()]; + for(int i = 0; i < variableNames.size(); i++) { + for(SysdynResult r : results) { + if(experiment instanceof SysdynGameExperiment) { + Double d = ((SysdynGameExperiment)experiment).getCurrentValue(variableNames.get(i)); + result[i] = d != null ? d : 0; + } else { + SysdynDataSet ds = r.getDataSet(variableNames.get(i)); + if(ds != null && ds.values != null && ds.values.length > 0) { + result[i] = ds.values[ds.values.length-1]; + } else { + return UNRESOLVED; + } + } + } + } + return result; + } + + @Override + public void setIndexedValue(WriteGraph graph, Object value) + throws DatabaseException { + Variable var = parent.getParent(graph); + Resource resource = var.getRepresents(graph); + + if(!(value instanceof double[]) || resource == null) + return; + + double[] values = (double[]) value; + + FMUControlJNI control = null; + if(experiment instanceof SysdynGameExperiment) { // Support only game experiments for now.. + + SysdynGameExperiment exp = (SysdynGameExperiment)experiment; + ExperimentState state = exp.getSysdynExperimentState(); + // Set value to control only if the simulation is running or stopped, not before initialization + if(!(ExperimentState.RUNNING.equals(state) || ExperimentState.STOPPED.equals(state))) + return; + + control = ((SysdynGameExperiment)this.experiment).getFMUControl(); + if(control == null) + return; + + + + ArrayList variableNames = getVariableNamesWithIndexNumbers(); + for(int i = 0; i < variableNames.size() && i < values.length; i++) { + if(values[i] == Double.NaN) + continue; + + try { + String name = variableNames.get(i); + control.setRealValue(name, values[i]); + + // Set value for all referred variables in modules + SysdynResource sr = SysdynResource.getInstance(graph); + for(Resource dependency : graph.getObjects(resource, sr.Variable_isTailOf)) { + Resource head = graph.getPossibleObject(dependency, sr.Variable_HasHead); + Resource ref = graph.getPossibleObject(dependency, sr.Dependency_refersTo); + if(ref != null && head != null) { + String module = ""; + if(name.indexOf(".") > 0) + module = name.substring(0, name.lastIndexOf(".") + 1); + String refName = module + NameUtils.getSafeName(graph, head) + "." + NameUtils.getSafeName(graph, ref); + control.setRealValue(refName, values[i]); + } + } + } catch (FMUJNIException e) { + } + } + exp.updateSubscriptions(); + } + } + +} diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/ValueIndexVariableI.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/ValueIndexVariableI.java new file mode 100644 index 00000000..b50195ba --- /dev/null +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/adapter/ValueIndexVariableI.java @@ -0,0 +1,23 @@ +package org.simantics.sysdyn.adapter; + +import org.simantics.db.ReadGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.variable.Variable; + +public class ValueIndexVariableI extends ValueIndexVariableBase { + + final int index; + + public ValueIndexVariableI(ReadGraph graph, Variable parent, int index) throws DatabaseException { + super(graph, parent, ""); + this.index = index; + } + + @Override + public Double getValue() { + double[] array = getValueFull(); + if(array == null || array.length < index+1) return Double.NaN; + return array[0]; + } + +} diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/Sheet.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/Sheet.java index 7a87c0b5..7a27fd24 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/Sheet.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/Sheet.java @@ -68,8 +68,10 @@ public class Sheet extends org.simantics.sysdyn.representation.Variable { String name = child.getName(g); try { SpreadsheetUtils.decodeCellAbsolute(name); - Variant value = child.getPropertyValue(g, SheetVariables.CONTENT, Bindings.VARIANT); - newCells.put(name, value.getValue()); + Object value = child.getPropertyValue(g, SheetVariables.CONTENT); + if(value instanceof Variant) { + newCells.put(name, ((Variant)value).getValue()); + } } catch (CellParseException e) { } catch (MissingVariableException e) { System.out.println("missing content for: " + name); diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/utils/IndexUtils.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/utils/IndexUtils.java index cc79fda7..360ffe1b 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/utils/IndexUtils.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/representation/utils/IndexUtils.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2011 Association for Decentralized Information Management in + * Copyright (c) 2007, 2011, 2014 Association for Decentralized Information Management in * Industry THTH ry. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -45,15 +45,24 @@ public class IndexUtils { if(variable.getArrayIndexes() == null || range == null) return ""; ArrayList enumerations = variable.getArrayIndexes(); - StringTokenizer st = new StringTokenizer(range, "[]:,", true); + StringTokenizer st = new StringTokenizer(range, "{}[]:,", true); int index = 0; + boolean insideCurlyBrackets = false; while(st.hasMoreTokens()) { String rangeToken = st.nextToken().trim(); if(rangeToken.matches("[\\[\\]:]")) { sb.append(rangeToken); + } else if(rangeToken.matches("[\\{]")) { + sb.append(rangeToken); + insideCurlyBrackets = true; + } else if(rangeToken.matches("[\\}]")) { + sb.append(rangeToken); + insideCurlyBrackets = false; } else if (rangeToken.equals(",")) { sb.append(rangeToken); - index++; + if (!insideCurlyBrackets) { + index++; + } } else if(index < enumerations.size()) { if(rangeToken.equals(enumerations.get(index).getName())) { sb.append(":"); diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/utils/DocumentationUtils.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/utils/DocumentationUtils.java index b3e39609..725516d3 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/utils/DocumentationUtils.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/utils/DocumentationUtils.java @@ -550,5 +550,33 @@ public class DocumentationUtils { } } + + public static org.simantics.db.layer0.variable.Variable lastValue2(ReadGraph graph, org.simantics.db.layer0.variable.Variable run, String path) throws DatabaseException { + + if(run == null) return null; + + org.simantics.db.layer0.variable.Variable v = run.browsePossible(graph, "/" + path); + if(v == null) return null; + + org.simantics.db.layer0.variable.Variable p = v.browsePossible(graph, "#value#$0"); + if(p == null) return null; + + return p; + + } + + public static org.simantics.db.layer0.variable.Variable equation(ReadGraph graph, org.simantics.db.layer0.variable.Variable run, String path) throws DatabaseException { + + if(run == null) return null; + + org.simantics.db.layer0.variable.Variable v = run.browsePossible(graph, "/" + path); + if(v == null) return null; + + org.simantics.db.layer0.variable.Variable p = v.browsePossible(graph, "#equation"); + if(p == null) return null; + + return p; + + } } diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/utils/LoopUtils.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/utils/LoopUtils.java index cfb10396..bd3d9095 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/utils/LoopUtils.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/utils/LoopUtils.java @@ -23,6 +23,7 @@ import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.common.utils.ListUtils; import org.simantics.db.exception.DatabaseException; +import org.simantics.db.exception.NoSingleResultException; import org.simantics.db.exception.ServiceException; import org.simantics.db.request.Read; import org.simantics.layer0.Layer0; @@ -283,8 +284,13 @@ public class LoopUtils { } skipBackwardFlows = true; - Resource dependencyConnection = graph.getSingleObject(dependency, mod.ConnectionToDiagramConnection); - String polarity = (String)graph.getPossibleRelatedValue(dependencyConnection, sr.DependencyConnection_polarity, Bindings.STRING); + Resource dependencyConnection; + try { + dependencyConnection = graph.getSingleObject(dependency, mod.ConnectionToDiagramConnection); + } catch (NoSingleResultException e) { + return LoopType.UNDEFINED; + } + String polarity = (String)graph.getPossibleRelatedValue(dependencyConnection, sr.DependencyConnection_polarity, Bindings.STRING); if ("-".equals(polarity)) { oddNumberOfNegativeCausalities = !oddNumberOfNegativeCausalities; } else if (polarity != null diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/utils/ModelUtils.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/utils/ModelUtils.java index 6a77c80b..e3212aba 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/utils/ModelUtils.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/utils/ModelUtils.java @@ -150,6 +150,15 @@ public class ModelUtils { DOC.HasReportFactory, report, l0.PartOf, model); + Resource sheetExperiment = GraphUtils.create2(g, SHEET.Experiment, + l0.HasName, "SheetExperiment", + l0.HasLabel, "Sheet Experiment", + l0.PartOf, model); + + Resource sheetRun = GraphUtils.create2(g, SHEET.Run, + l0.HasName, "Default", + l0.PartOf, sheetExperiment); + ProjectResource PROJ = ProjectResource.getInstance(g); for(Resource dep : g.getObjects(library, l0.IsLinkedTo)) { if(g.isInstanceOf(dep, PROJ.NamespaceRequirement)) { diff --git a/org.simantics.sysdyn/src/org/simantics/sysdyn/utils/ProfileEntries.java b/org.simantics.sysdyn/src/org/simantics/sysdyn/utils/ProfileEntries.java index f53920c9..cb18b868 100644 --- a/org.simantics.sysdyn/src/org/simantics/sysdyn/utils/ProfileEntries.java +++ b/org.simantics.sysdyn/src/org/simantics/sysdyn/utils/ProfileEntries.java @@ -17,6 +17,7 @@ import org.simantics.db.exception.DatabaseException; import org.simantics.diagram.profile.Profiles; import org.simantics.diagram.stubs.DiagramResource; import org.simantics.layer0.Layer0; +import org.simantics.simulation.ontology.SimulationResource; import org.simantics.sysdyn.SysdynResource; public class ProfileEntries { @@ -43,6 +44,12 @@ public class ProfileEntries { // public void perform(WriteGraph graph) throws DatabaseException { // DiagramResource DIA = DiagramResource.getInstance(graph); graph.claim(model, DIA.HasActiveProfile, defaultProfile); + SimulationResource SIMU = SimulationResource.getInstance(graph); + graph.claim(defaultProfile, SIMU.IsActive, null, sr.Profiles_IssueWarnings); + graph.claim(defaultProfile, SIMU.IsActive, null, sr.Profiles_ShadowVisualizations); + graph.claim(model, DIA.HasActiveProfile, simulationPlaybackProfile); + graph.claim(simulationPlaybackProfile, SIMU.IsActive, null, sr.Profiles_SimulationPlaybackColours); + // } // }); -- 2.47.1