Xcos simulation : fix realtime scaling usage
[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 - 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.PropertyVetoException;
20 import java.beans.VetoableChangeListener;
21 import java.beans.VetoableChangeSupport;
22 import java.io.Serializable;
23
24 import org.scilab.modules.xcos.JavaController;
25 import org.scilab.modules.xcos.Kind;
26 import org.scilab.modules.xcos.ObjectProperties;
27 import org.scilab.modules.xcos.VectorOfDouble;
28 import org.scilab.modules.xcos.VectorOfString;
29 import org.scilab.modules.xcos.preferences.XcosOptions;
30
31 /**
32  * Contains Scicos specific parameters.
33  *
34  * This class is a java beans and follow standard properties accessors.
35  *
36  * @see <a href="http://java.sun.com/docs/books/tutorial/javabeans/properties/bound.html">JavaBeans Bound Properties</a>
37  */
38 @SuppressWarnings(value = { "serial" })
39 public class ScicosParameters implements Serializable, Cloneable {
40
41     /*
42      * Bean properties
43      */
44     /**
45      * Property bound to finalIntegrationTime modification.
46      */
47     public static final String FINAL_INTEGRATION_TIME_CHANGE = "finalIntegrationTime";
48     /**
49      * Property bound to integratorAbsoluteTolerance modification.
50      */
51     public static final String INTEGRATOR_ABSOLUTE_TOLERANCE_CHANGE = "integratorAbsoluteTolerance";
52     /**
53      * Property bound to integratorRelativeTolerance modification.
54      */
55     public static final String INTEGRATOR_RELATIVE_TOLERANCE_CHANGE = "integratorRelativeTolerance";
56     /**
57      * Property bound to toleranceOnTime modification.
58      */
59     public static final String TOLERANCE_ON_TIME_CHANGE = "toleranceOnTime";
60     /**
61      * Property bound to maxIntegrationTimeInterval modification.
62      */
63     public static final String MAX_INTEGRATION_TIME_INTERVAL_CHANGE = "maxIntegrationTimeInterval";
64     /**
65      * Property bound to realTimeScaling modification.
66      */
67     public static final String REAL_TIME_SCALING_CHANGE = "realTimeScaling";
68     /**
69      * Property bound to solver modification.
70      */
71     public static final String SOLVER_CHANGE = "solver";
72     /**
73      * Property bound to maximumStepSize modification.
74      */
75     public static final String MAXIMUM_STEP_SIZE_CHANGE = "maximumStepSize";
76     /**
77      * Property bound to debugLevel modification.
78      */
79     public static final String DEBUG_LEVEL_CHANGE = "debugLevel";
80     /**
81      * Property bound to context modification.
82      */
83     public static final String CONTEXT_CHANGE = "context";
84
85     /*
86      * Index inside the VectorOfDouble object
87      */
88     public static final int FINAL_INTEGRATION_TIME = 0;
89     public static final int INTEGRATOR_ABSOLUTE_TOLERANCE = 1;
90     public static final int INTEGRATOR_RELATIVE_TOLERANCE = 2;
91     public static final int TOLERANCE_ON_TIME = 3;
92     public static final int MAX_INTEGRATION_TIME_INTERVAL = 4;
93     public static final int REAL_TIME_SCALING = 5;
94     public static final int SOLVER = 6;
95     public static final int MAXIMUM_STEP_SIZE = 7;
96
97     /*
98      * Default values from the preferences
99      */
100     public static VectorOfDouble DEFAULT_PARAMETERS;
101     public static int DEFAULT_DEBUG_LEVEL;
102
103     /**
104      * Reference to the diagram
105      */
106     private final long uid;
107     private final Kind kind;
108
109     /*
110      * Beans support, used to follow instance modification and validate changes.
111      */
112     private final VetoableChangeSupport vcs = new VetoableChangeSupport(this);
113
114     /**
115      * Default constructor
116      *
117      * Initialize parameters with their default values.
118      */
119     public ScicosParameters(final long uid, final Kind kind) {
120         this.uid = uid;
121         this.kind = kind;
122
123         /*
124          * This call will update static values from the configuration.
125          */
126         XcosOptions.getSimulation();
127     }
128
129     public long getUID() {
130         return uid;
131     }
132
133     public Kind getKind() {
134         return kind;
135     }
136
137     /**
138      * Returns the properties values
139      *
140      * @param controller
141      *            the controller instance
142      * @return the current properties
143      */
144     public VectorOfDouble getProperties(final JavaController controller) {
145         VectorOfDouble v = new VectorOfDouble(7);
146         controller.getObjectProperty(getUID(), getKind(), ObjectProperties.PROPERTIES, v);
147         return v;
148     }
149
150     /**
151      * Set the properties
152      *
153      * @param controller
154      *            the controller instance
155      * @param v
156      *            the values to set
157      * @throws PropertyVetoException
158      *             in case of the values are not valid
159      */
160     public void setProperties(final JavaController controller, VectorOfDouble v) throws PropertyVetoException {
161         VectorOfDouble oldValue = getProperties(controller);
162         vcs.fireVetoableChange(FINAL_INTEGRATION_TIME_CHANGE, oldValue, v);
163         controller.setObjectProperty(getUID(), getKind(), ObjectProperties.PROPERTIES, v);
164     }
165
166     /**
167      * @return current context
168      */
169     public VectorOfString getContext(final JavaController controller) {
170         VectorOfString v = new VectorOfString();
171         controller.getObjectProperty(getUID(), getKind(), ObjectProperties.DIAGRAM_CONTEXT, v);
172         return v;
173     }
174
175     /**
176      * Set the associated context if there is noticeable changes.
177      *
178      * @param controller
179      *            the controller
180      * @param v
181      *            set context
182      * @throws PropertyVetoException
183      *             when the value is not acceptable.
184      */
185     public void setContext(final JavaController controller, VectorOfString v) throws PropertyVetoException {
186         VectorOfString oldValue = getContext(controller);
187         vcs.fireVetoableChange(CONTEXT_CHANGE, oldValue, v);
188         controller.setObjectProperty(getUID(), getKind(), ObjectProperties.DIAGRAM_CONTEXT, v);
189     }
190
191     /**
192      * @param controller
193      *            the controller instance
194      * @return current version
195      */
196     public String getVersion(final JavaController controller) {
197         String[] v = new String[1];
198         controller.getObjectProperty(getUID(), getKind(), ObjectProperties.VERSION_NUMBER, v);
199         return v[0];
200     }
201
202     /**
203      * @return current debug level
204      */
205     public int getDebugLevel(final JavaController controller) {
206         int[] v = new int[1];
207         controller.getObjectProperty(getUID(), getKind(), ObjectProperties.DEBUG_LEVEL, v);
208         return v[0];
209     }
210
211     /**
212      * @param debugLevel
213      *            change debug level
214      * @throws PropertyVetoException
215      *             when the value is not acceptable.
216      */
217     public void setDebugLevel(final JavaController controller, int debugLevel) throws PropertyVetoException {
218         int oldValue = getDebugLevel(controller);
219         vcs.fireVetoableChange(DEBUG_LEVEL_CHANGE, oldValue, debugLevel);
220         controller.setObjectProperty(getUID(), getKind(), ObjectProperties.DIAGRAM_CONTEXT, debugLevel);
221     }
222
223     /*
224      * VetoableChangeSupport proxy methods
225      */
226
227     /**
228      * Each setXXX method fire a vetoable change event. This method register a new listener for all events.
229      *
230      * @param listener
231      *            A listener
232      */
233     public void addVetoableChangeListener(VetoableChangeListener listener) {
234         this.vcs.addVetoableChangeListener(listener);
235     }
236
237     /**
238      * Each setXXX method fire a vetoable change event. This method register a new listener for a specific event. Each event name is equal to the field name.
239      *
240      * @param propertyName
241      *            the property name
242      * @param listener
243      *            A listener
244      */
245     public void addVetoableChangeListener(String propertyName, VetoableChangeListener listener) {
246         this.vcs.addVetoableChangeListener(propertyName, listener);
247     }
248
249     /**
250      * Each setXXX method fire a vetoable change event. This method remove a listener for all events.
251      *
252      * @param listener
253      *            A listener
254      */
255     public void removeVetoableChangeListener(VetoableChangeListener listener) {
256         this.vcs.removeVetoableChangeListener(listener);
257     }
258
259     /**
260      * Each setXXX method fire a vetoable change event. This method remove a listener for a specific event. Each event name is equal to the field name.
261      *
262      * @param propertyName
263      *            the property name
264      * @param listener
265      *            A listener
266      */
267     public void removeVetoableChangeListener(String propertyName, VetoableChangeListener listener) {
268         this.vcs.removeVetoableChangeListener(propertyName, listener);
269     }
270
271     /**
272      * {@inheritDoc}
273      */
274     @Override
275     public Object clone() throws CloneNotSupportedException {
276         return super.clone();
277     }
278 }