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