Bug 11982 fixed: ticks computation were made when drawing
[scilab.git] / scilab / modules / renderer / src / java / org / scilab / modules / renderer / JoGLView / axes / ruler / RulerDrawerManager.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009-2010 - 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-en.txt
11  */
12
13 package org.scilab.modules.renderer.JoGLView.axes.ruler;
14
15 import org.scilab.forge.scirenderer.ruler.RulerDrawer;
16 import org.scilab.forge.scirenderer.texture.TextureManager;
17 import org.scilab.modules.graphic_objects.axes.Axes;
18 import org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties;
19
20 import java.util.Arrays;
21 import java.util.HashMap;
22 import java.util.HashSet;
23 import java.util.Map;
24 import java.util.Set;
25
26 /**
27  * This class maintain a set of {@see RulerSpriteManager} for all the {@see Axes} create in the {@see GraphicController}
28  * This {@see RulerSpriteManager} are used to draw the rulers of all {@see Axes}.
29  *
30  * @author Pierre Lando
31  */
32 class RulerDrawerManager {
33
34     /**
35      * Set of properties that affect ruler sprites.
36      */
37     private static final Set<Integer> SPRITE_PROPERTIES = new HashSet<Integer>(Arrays.asList(
38                 GraphicObjectProperties.__GO_FONT_SIZE__,
39                 GraphicObjectProperties.__GO_FONT_COLOR__,
40                 GraphicObjectProperties.__GO_FONT_STYLE__,
41                 GraphicObjectProperties.__GO_FONT_FRACTIONAL__,
42                 GraphicObjectProperties.__GO_X_AXIS_AUTO_TICKS__,
43                 GraphicObjectProperties.__GO_Y_AXIS_AUTO_TICKS__,
44                 GraphicObjectProperties.__GO_Z_AXIS_AUTO_TICKS__,
45                 GraphicObjectProperties.__GO_X_AXIS_LOG_FLAG__,
46                 GraphicObjectProperties.__GO_Y_AXIS_LOG_FLAG__,
47                 GraphicObjectProperties.__GO_Z_AXIS_LOG_FLAG__
48             ));
49
50     /**
51      * Map of up to date {@see RulerSpriteManager}
52      * The key are the {@see Axes} id.
53      */
54     private final Map<String, RulerDrawer[]> rulerSpriteManagerMap = new HashMap<String, RulerDrawer[]>();
55
56     /** The {@see TextureManager} of the current {@see Canvas}. */
57     private final TextureManager textureManager;
58
59     /**
60      * Default constructor.
61      * @param textureManager the {@see TextureManager} of the current {@see Canvas}.
62      */
63     public RulerDrawerManager(TextureManager textureManager) {
64         this.textureManager = textureManager;
65     }
66
67     /**
68      * Return the {@see RulerDrawer} for the rulers of the given {@see Axes}.
69      * @param axes the given {@see Axes}
70      * @return the {@see RulerSpriteManager} for the rulers of the given {@see Axes}.
71      */
72     public RulerDrawer[] get(Axes axes) {
73         RulerDrawer[] rulerSpriteManager = rulerSpriteManagerMap.get(axes.getIdentifier());
74         if (rulerSpriteManager == null) {
75             rulerSpriteManager = new RulerDrawer[] {new RulerDrawer(textureManager), new RulerDrawer(textureManager), new RulerDrawer(textureManager)};
76             rulerSpriteManager[0].setSpriteFactory(new AxesRulerSpriteFactory(axes, 0));
77             rulerSpriteManager[1].setSpriteFactory(new AxesRulerSpriteFactory(axes, 1));
78             rulerSpriteManager[2].setSpriteFactory(new AxesRulerSpriteFactory(axes, 2));
79             rulerSpriteManagerMap.put(axes.getIdentifier(), rulerSpriteManager);
80         }
81         return rulerSpriteManager;
82     }
83
84
85     /**
86      * Update the data if needed.
87      * @param id the modified object.
88      * @param property the changed property.
89      * @return true if it is really updated
90      */
91     public boolean update(String id, int property) {
92
93         /**
94          * If update affect {@see Axes} ruler sprites, we clear the corresponding {@see RulerSpriteManager}.
95          * TODO : optimize by an X, Y, Z auto ticks differentiation.
96          */
97         if (SPRITE_PROPERTIES.contains(property)) {
98             dispose(id);
99             return true;
100         }
101
102         if (property == GraphicObjectProperties.__GO_X_AXIS_TICKS_LABELS__) {
103             RulerDrawer[] rulerSpriteManager = rulerSpriteManagerMap.get(id);
104             if (rulerSpriteManager != null) {
105                 rulerSpriteManager[0].disposeResources();
106             }
107         } else if (property == GraphicObjectProperties.__GO_Y_AXIS_TICKS_LABELS__) {
108             RulerDrawer[] rulerSpriteManager = rulerSpriteManagerMap.get(id);
109             if (rulerSpriteManager != null) {
110                 rulerSpriteManager[1].disposeResources();
111             }
112         } else if (property == GraphicObjectProperties.__GO_Z_AXIS_TICKS_LABELS__) {
113             RulerDrawer[] rulerSpriteManager = rulerSpriteManagerMap.get(id);
114             if (rulerSpriteManager != null) {
115                 rulerSpriteManager[2].disposeResources();
116             }
117         }
118
119         return false;
120     }
121
122     /**
123      * Dispose the {@see RulerSpriteManager} of the given axes.
124      * @param id the {@see Axes} id.
125      */
126     public void dispose(String id) {
127         RulerDrawer[] rulerDrawers = rulerSpriteManagerMap.get(id);
128         if (rulerDrawers != null) {
129             for (RulerDrawer rulerDrawer : rulerDrawers) {
130                 if (rulerDrawer != null) {
131                     rulerDrawer.disposeResources();
132                 }
133             }
134         }
135         rulerSpriteManagerMap.remove(id);
136     }
137
138     /**
139      * Dispose all the {@see RulerSpriteManager}.
140      */
141     public void disposeAll() {
142         for (RulerDrawer[] rulerDrawers : rulerSpriteManagerMap.values()) {
143             if (rulerDrawers != null) {
144                 for (RulerDrawer rulerDrawer : rulerDrawers) {
145                     if (rulerDrawer != null) {
146                         rulerDrawer.disposeResources();
147                     }
148                 }
149             }
150         }
151         rulerSpriteManagerMap.clear();
152     }
153 }