Definitly fix bug 11067: add ticks_format and ticks_st properties to improve ticks...
[scilab.git] / scilab / modules / scirenderer / src / org / scilab / forge / scirenderer / ruler / DefaultRulerModel.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009-2011 - DIGITEO - Pierre Lando
4  * Copyright (C) 2013 - Scilab Enterprises - Calixte DENIZET
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 package org.scilab.forge.scirenderer.ruler;
14
15 import org.scilab.forge.scirenderer.ruler.graduations.Graduations;
16 import org.scilab.forge.scirenderer.ruler.graduations.LinearGraduations;
17 import org.scilab.forge.scirenderer.ruler.graduations.LogarithmicGraduations;
18 import org.scilab.forge.scirenderer.shapes.appearance.Color;
19 import org.scilab.forge.scirenderer.tranformations.Vector3d;
20
21 /**
22  * Default ruler model.
23  *
24  * @author Pierre Lando
25  */
26 public final class DefaultRulerModel implements RulerModel {
27
28     /**
29      * Value associated with the first point.
30      */
31     private double firstValue = DEFAULT_FIRST_VALUE;
32
33     /**
34      * Value associated with the second point.
35      */
36     private double secondValue = DEFAULT_SECOND_VALUE;
37
38     /**
39      * First point position in world coordinate.
40      */
41     private Vector3d firstPoint = DEFAULT_FIRST_POINT;
42
43     /**
44      * Second point position in world coordinate.
45      */
46     private Vector3d secondPoint = DEFAULT_SECOND_POINT;
47
48     /**
49      * Ticks direction, in world coordinate.
50      */
51     private Vector3d ticksDirection = DEFAULT_TICKS_DIRECTION;
52
53     /**
54      * Ticks length, in pixel.
55      */
56     private int ticksLength = DEFAULT_TICK_LENGTH;
57
58     /**
59      * Sub ticks length, in pixel.
60      */
61     private int subTicksLength = DEFAULT_SUB_TICK_LENGTH;
62
63     /**
64      * Minimal sub-ticks distance.
65      */
66     private double minimalSubTicksDistance = DEFAULT_MINIMAL_SUB_TICKS_DISTANCE;
67
68     /**
69      * Sprite distance to segment, in pixel.
70
71      */
72     private int spriteDistance = DEFAULT_SPRITE_DISTANCE;
73
74     /**
75      * The graduations.
76      */
77     private Graduations graduations;
78
79     /**
80      * Current margin.
81      * The margin is the minimal allowed distance between to sprite of the same ruler.
82      */
83     private double margin = DEFAULT_MARGIN;
84
85     /**
86      * Current line visibility.
87      */
88     private boolean lineVisible = DEFAULT_LINE_VISIBLE;
89
90     /**
91      * Auto-ticks status.
92      */
93     private boolean isAutoTicks = DEFAULT_AUTO_TICKS_STATUS;
94
95     /**
96      * Logarithmic status.
97      */
98     private boolean isLogarithmic = DEFAULT_LOGARITHMIC_STATUS;
99
100     /**
101      * Current color.
102      */
103     private Color color = DEFAULT_COLOR;
104
105     /**
106      * Used graduations when {@link this#isAutoTicks} is false.
107      */
108     private Graduations userGraduation;
109
110     /**
111      * Line width
112      */
113     private double lineWidth = DEFAULT_LINE_WIDTH;
114
115     private int subticksNumber = -1;
116     private String format = "";
117     private double scale;
118     private double translate;
119
120     /**
121      * Default constructor.
122      */
123     public DefaultRulerModel() {
124     }
125
126     @Override
127     public double getFirstValue() {
128         return firstValue;
129     }
130
131     /**
132      * First value setter.
133      * @param firstValue the new first value.
134      */
135     public void setFirstValue(double firstValue) {
136         graduations = null;
137         this.firstValue = (Double.isInfinite(firstValue) ? Double.MAX_VALUE : firstValue);
138     }
139
140     @Override
141     public double getSecondValue() {
142         return secondValue;
143     }
144
145     /**
146      * Second value setter.
147      * @param secondValue the new second value.
148      */
149     public void setSecondValue(double secondValue) {
150         graduations = null;
151         this.secondValue = (Double.isInfinite(secondValue) ? Double.MAX_VALUE : secondValue);
152     }
153
154     /**
155      * Set the first and second value in one call.
156      * @param firstValue the first value.
157      * @param secondValue the second value.
158      */
159     public void setValues(double firstValue, double secondValue) {
160         setFirstValue(firstValue);
161         setSecondValue(secondValue);
162     }
163
164     @Override
165     public Vector3d getFirstPoint() {
166         return firstPoint;
167     }
168
169     /**
170      * First point setter.
171      * @param firstPoint the new first point.
172      */
173     public void setFirstPoint(Vector3d firstPoint) {
174         this.firstPoint = firstPoint;
175     }
176
177     @Override
178     public Vector3d getSecondPoint() {
179         return secondPoint;
180     }
181
182     /**
183      * Second point setter.
184      * @param secondPoint the new second point.
185      */
186     public void setSecondPoint(Vector3d secondPoint) {
187         this.secondPoint = secondPoint;
188     }
189
190     /**
191      * Point setter.
192      * @param firstPoint the new first point.
193      * @param secondPoint the new second point.
194      */
195     public void setPoints(Vector3d firstPoint, Vector3d secondPoint) {
196         this.firstPoint = firstPoint;
197         this.secondPoint = secondPoint;
198     }
199
200     @Override
201     public Vector3d getTicksDirection() {
202         return ticksDirection;
203     }
204
205     /**
206      * Ticks direction setter.
207      * @param ticksDirection the new ticks direction.
208      */
209     public void setTicksDirection(Vector3d ticksDirection) {
210         this.ticksDirection = ticksDirection;
211     }
212
213     @Override
214     public int getTicksLength() {
215         return ticksLength;
216     }
217
218     /**
219      * Ticks length setter.
220      * @param ticksLength the new tick length in pixels.
221      */
222     public void setTicksLength(int ticksLength) {
223         this.ticksLength = ticksLength;
224     }
225
226     @Override
227     public int getSubTicksLength() {
228         return subTicksLength;
229     }
230
231     /**
232      * Sub-ticks length setter.
233      * @param subTicksLength the new sub-tick length in pixels.
234      */
235     public void setSubTicksLength(int subTicksLength) {
236         this.subTicksLength = subTicksLength;
237     }
238
239     @Override
240     public Graduations getGraduations() {
241         if (isAutoTicks) {
242             if (graduations == null) {
243                 if (isLogarithmic) {
244                     graduations = LogarithmicGraduations.create(getFirstValue(), getSecondValue());
245                 } else {
246                     graduations = LinearGraduations.create(getFirstValue(), getSecondValue());
247                 }
248             }
249             return graduations;
250         } else {
251             return userGraduation;
252         }
253     }
254
255     /**
256      * User graduation setter.
257      * @param graduations the new user-defined graduations.
258      */
259     public void setUserGraduation(Graduations graduations) {
260         this.userGraduation = graduations;
261     }
262
263     @Override
264     public Vector3d getPosition(double value) {
265         if ((firstPoint != null) && (secondPoint != null)) {
266             if (isLogarithmic()) {
267                 double valueLog = Math.log10(value);
268                 double firstValueLog = Math.log10(firstValue);
269                 double secondValueLog = Math.log10(secondValue);
270                 double s = (secondValueLog - firstValueLog);
271                 double k1 = (valueLog - firstValueLog) / s;
272                 double k2 = (secondValueLog - valueLog) / s;
273                 return firstPoint.times(k2).plus(secondPoint.times(k1));
274             } else {
275                 double s = (secondValue - firstValue);
276                 return firstPoint.times((secondValue - value) / s).plus(secondPoint.times((value - firstValue) / s));
277             }
278         } else {
279             return null;
280         }
281     }
282
283     @Override
284     public double getMargin() {
285         return margin;
286     }
287
288     /**
289      * Margin setter.
290      * The margin is minimal distance accepted between ticks labels.
291      * @param margin the new margin value.
292      */
293     public void setMargin(double margin) {
294         this.margin = margin;
295     }
296
297     @Override
298     public boolean isLineVisible() {
299         return lineVisible;
300     }
301
302     /**
303      * Line visibility setter.
304      * @param lineVisible the new line visibility status.
305      */
306     public void setLineVisible(boolean lineVisible) {
307         this.lineVisible = lineVisible;
308     }
309
310     @Override
311     public boolean isAutoTicks() {
312         return isAutoTicks;
313     }
314
315     /**
316      * Auto-ticks parameter setter.
317      * If it set to {@code false}, the user defined graduation will be used.
318      * @param isAutoTicks the new auto-ticks status.
319      */
320     public void setAutoTicks(boolean isAutoTicks) {
321         this.isAutoTicks = isAutoTicks;
322     }
323
324     @Override
325     public boolean isLogarithmic() {
326         return isLogarithmic;
327     }
328
329     /**
330      * Logarithmic or linear setter
331      * @param isLogarithmic the new logarithmic status.
332      */
333     public void setLogarithmic(boolean isLogarithmic) {
334         if (isLogarithmic != this.isLogarithmic) {
335             this.isLogarithmic = isLogarithmic;
336             graduations = null;
337         }
338     }
339
340     @Override
341     public int getSpriteDistance() {
342         return spriteDistance;
343     }
344
345     /**
346      * Sprite distance setter.
347      * @param spriteDistance the new sprite distance to the main ticks in pixel.
348      */
349     public void setSpriteDistance(int spriteDistance) {
350         this.spriteDistance = spriteDistance;
351     }
352
353     @Override
354     public double getMinimalSubTicksDistance() {
355         return minimalSubTicksDistance;
356     }
357
358     /**
359      * Minimal accepted distance between sub-ticks setter.
360      * @param minimalSubTicksDistance the new minimal accepted distance between sub-ticks.
361      */
362     public void setMinimalSubTicksDistance(double minimalSubTicksDistance) {
363         this.minimalSubTicksDistance = minimalSubTicksDistance;
364     }
365
366     @Override
367     public Color getColor() {
368         return color;
369     }
370
371     /**
372      * Ruler color setter.
373      * @param color the new rule color.
374      */
375     public void setColor(Color color) {
376         this.color = color;
377     }
378
379     @Override
380     public double getLineWidth() {
381         return lineWidth;
382     }
383
384     /**
385      * Ruler line width setter
386      * @param lineWidth the new line width
387      */
388     public void setLineWidth(double lineWidth) {
389         this.lineWidth = lineWidth;
390     }
391
392     @Override
393     public int getSubticksNumber() {
394         return subticksNumber;
395     }
396
397     /**
398      * Set number of subticks.
399      * @param N the number of subticks or -1 if the computation is automatic.
400      */
401     public void setSubticksNumber(int N) {
402         this.subticksNumber = N;
403     }
404
405     @Override
406     public String getFormat() {
407         return format;
408     }
409
410     /**
411      * Set the format.
412      * @param format the format as used in String.format.
413      */
414     public void setFormat(String format) {
415         this.format = format;
416     }
417
418     @Override
419     public double getScale() {
420         return scale;
421     }
422
423     @Override
424     public double getTranslate() {
425         return translate;
426     }
427
428     /**
429      * Set the scale-translate factors.
430      * @param .
431      */
432     public void setSTFactors(Double[] factors) {
433         this.scale = factors[0];
434         this.translate = factors[1];
435     }
436 }