* Bug #15072 fixed: The context was stored as a root diagram attribute instead of...
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / graph / ScicosParameters.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - DIGITEO - Clement DAVID
4  * Copyright (C) 2011-2017 - Scilab Enterprises - Clement DAVID
5  *
6  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16
17 package org.scilab.modules.xcos.graph;
18
19 import java.beans.PropertyChangeEvent;
20 import java.beans.PropertyVetoException;
21 import java.beans.VetoableChangeListener;
22 import java.beans.VetoableChangeSupport;
23 import java.io.Serializable;
24
25 import org.scilab.modules.xcos.JavaController;
26 import org.scilab.modules.xcos.Kind;
27 import org.scilab.modules.xcos.ObjectProperties;
28 import org.scilab.modules.xcos.VectorOfDouble;
29 import org.scilab.modules.xcos.VectorOfString;
30 import org.scilab.modules.xcos.Xcos;
31 import org.scilab.modules.xcos.graph.model.ScicosObjectOwner;
32 import org.scilab.modules.xcos.preferences.XcosOptions;
33
34 /**
35  * Contains Scicos specific parameters.
36  *
37  * This class is a java beans and follow standard properties accessors.
38  *
39  * @see <a href="http://java.sun.com/docs/books/tutorial/javabeans/properties/bound.html">JavaBeans Bound Properties</a>
40  */
41 @SuppressWarnings(value = { "serial" })
42 public class ScicosParameters implements Serializable, Cloneable {
43
44     /*
45      * Bean properties
46      */
47     /**
48      * Property bound to finalIntegrationTime modification.
49      */
50     public static final String FINAL_INTEGRATION_TIME_CHANGE = "finalIntegrationTime";
51     /**
52      * Property bound to integratorAbsoluteTolerance modification.
53      */
54     public static final String INTEGRATOR_ABSOLUTE_TOLERANCE_CHANGE = "integratorAbsoluteTolerance";
55     /**
56      * Property bound to integratorRelativeTolerance modification.
57      */
58     public static final String INTEGRATOR_RELATIVE_TOLERANCE_CHANGE = "integratorRelativeTolerance";
59     /**
60      * Property bound to toleranceOnTime modification.
61      */
62     public static final String TOLERANCE_ON_TIME_CHANGE = "toleranceOnTime";
63     /**
64      * Property bound to maxIntegrationTimeInterval modification.
65      */
66     public static final String MAX_INTEGRATION_TIME_INTERVAL_CHANGE = "maxIntegrationTimeInterval";
67     /**
68      * Property bound to realTimeScaling modification.
69      */
70     public static final String REAL_TIME_SCALING_CHANGE = "realTimeScaling";
71     /**
72      * Property bound to solver modification.
73      */
74     public static final String SOLVER_CHANGE = "solver";
75     /**
76      * Property bound to maximumStepSize modification.
77      */
78     public static final String MAXIMUM_STEP_SIZE_CHANGE = "maximumStepSize";
79     /**
80      * Property bound to debugLevel modification.
81      */
82     public static final String DEBUG_LEVEL_CHANGE = "debugLevel";
83     /**
84      * Property bound to context modification.
85      */
86     public static final String CONTEXT_CHANGE = "context";
87
88     /*
89      * Index inside the VectorOfDouble object
90      */
91     public static final int FINAL_INTEGRATION_TIME = 0;
92     public static final int INTEGRATOR_ABSOLUTE_TOLERANCE = 1;
93     public static final int INTEGRATOR_RELATIVE_TOLERANCE = 2;
94     public static final int TOLERANCE_ON_TIME = 3;
95     public static final int MAX_INTEGRATION_TIME_INTERVAL = 4;
96     public static final int REAL_TIME_SCALING = 5;
97     public static final int SOLVER = 6;
98     public static final int MAXIMUM_STEP_SIZE = 7;
99
100     /*
101      * Default values from the preferences
102      */
103     public static VectorOfDouble DEFAULT_PARAMETERS;
104     public static int DEFAULT_DEBUG_LEVEL;
105
106     /**
107      * Reference to the root diagram
108      */
109     private final ScicosObjectOwner root;
110
111     /**
112      * Reference to the current diagram
113      */
114     private final ScicosObjectOwner current;
115
116     /*
117      * Beans support, used to follow instance modification and validate changes.
118      */
119     private final VetoableChangeSupport vcs = new VetoableChangeSupport(this);
120
121     /**
122      * Default constructor
123      *
124      * Initialize parameters with their default values.
125      * @param root the root diagram
126      * @param current the current diagram
127      */
128     public ScicosParameters(final ScicosObjectOwner root, final ScicosObjectOwner current) {
129         this.root = root;
130         this.current = current;
131
132         /*
133          * This call will update static values from the configuration.
134          */
135         XcosOptions.getSimulation();
136
137         // install the modification handler
138         vcs.addVetoableChangeListener((PropertyChangeEvent evt) -> {
139             Xcos xcos = Xcos.getInstance();
140             if (!xcos.openedDiagrams(root).isEmpty()) {
141                 xcos.setModified(root, true);
142                 xcos.openedDiagrams(root).stream().forEach(d -> d.updateTabTitle());
143             }
144         });
145     }
146
147     public ScicosObjectOwner getRoot() {
148         return root;
149     }
150
151     public ScicosObjectOwner getCurrent() {
152         return current;
153     }
154
155     /**
156      * Returns the properties values
157      *
158      * @param controller
159      *            the controller instance
160      * @return the current properties
161      */
162     public VectorOfDouble getProperties(final JavaController controller) {
163         VectorOfDouble v = new VectorOfDouble(7);
164         controller.getObjectProperty(root.getUID(), root.getKind(), ObjectProperties.PROPERTIES, v);
165         return v;
166     }
167
168     /**
169      * Set the properties
170      *
171      * @param controller
172      *            the controller instance
173      * @param v
174      *            the values to set
175      * @throws PropertyVetoException
176      *             in case of the values are not valid
177      */
178     public void setProperties(final JavaController controller, VectorOfDouble v) throws PropertyVetoException {
179         VectorOfDouble oldValue = getProperties(controller);
180         vcs.fireVetoableChange(FINAL_INTEGRATION_TIME_CHANGE, oldValue, v);
181         controller.setObjectProperty(root.getUID(), root.getKind(), ObjectProperties.PROPERTIES, v);
182     }
183
184     /**
185      * @return current context
186      */
187     public VectorOfString getContext(final JavaController controller) {
188         VectorOfString v = new VectorOfString();
189         controller.getObjectProperty(current.getUID(), current.getKind(), ObjectProperties.DIAGRAM_CONTEXT, v);
190         return v;
191     }
192
193     /**
194      * Set the associated context if there is noticeable changes.
195      *
196      * @param controller
197      *            the controller
198      * @param v
199      *            set context
200      * @throws PropertyVetoException
201      *             when the value is not acceptable.
202      */
203     public void setContext(final JavaController controller, VectorOfString v) throws PropertyVetoException {
204         VectorOfString oldValue = getContext(controller);
205         vcs.fireVetoableChange(CONTEXT_CHANGE, oldValue, v);
206         controller.setObjectProperty(current.getUID(), current.getKind(), ObjectProperties.DIAGRAM_CONTEXT, v);
207     }
208
209     /**
210      * @param controller
211      *            the controller instance
212      * @return current version
213      */
214     public String getVersion(final JavaController controller) {
215         String[] v = new String[1];
216         controller.getObjectProperty(root.getUID(), root.getKind(), ObjectProperties.VERSION_NUMBER, v);
217         return v[0];
218     }
219
220     /**
221      * @return current debug level
222      */
223     public int getDebugLevel(final JavaController controller) {
224         int[] v = new int[1];
225         controller.getObjectProperty(root.getUID(), root.getKind(), ObjectProperties.DEBUG_LEVEL, v);
226         return v[0];
227     }
228
229     /**
230      * @param debugLevel
231      *            change debug level
232      * @throws PropertyVetoException
233      *             when the value is not acceptable.
234      */
235     public void setDebugLevel(final JavaController controller, int debugLevel) throws PropertyVetoException {
236         int oldValue = getDebugLevel(controller);
237         vcs.fireVetoableChange(DEBUG_LEVEL_CHANGE, oldValue, debugLevel);
238         controller.setObjectProperty(root.getUID(), root.getKind(), ObjectProperties.DEBUG_LEVEL, debugLevel);
239     }
240 }