Interface margins and axes bounds properties.
[scilab.git] / scilab / modules / renderer / src / java / org / scilab / modules / renderer / figureDrawing / DrawableFigureJoGL.java
1 /*------------------------------------------------------------------------*/
2 /* file: DrawableFigureJoGL.java                                          */
3 /* Copyright INRIA 2007                                                   */
4 /* Authors : Jean-Baptiste Silvy                                          */
5 /* desc : Class containing the driver dependant routines to draw a        */
6 /*        figure object with JoGL                                         */
7 /*------------------------------------------------------------------------*/
8
9 package org.scilab.modules.renderer.figureDrawing;
10
11
12 import javax.media.opengl.GL;
13
14 import org.scilab.modules.gui.window.ScilabWindow;
15 import org.scilab.modules.gui.window.Window;
16 import org.scilab.modules.gui.tab.ScilabTab;
17 import org.scilab.modules.gui.tab.Tab;
18
19 import org.scilab.modules.renderer.ObjectJoGL;
20 import org.scilab.modules.renderer.FigureMapper;
21 import org.scilab.modules.renderer.utils.ColorMap;
22 import org.scilab.modules.renderer.ObjectJoGLCleaner;
23
24 import org.scilab.modules.gui.utils.Size;
25
26
27 /**
28  * Class containing functions called by DrawableFigureJoGL.cpp
29  * @author Jean-Baptiste Silvy
30  */
31 public class DrawableFigureJoGL extends ObjectJoGL {
32         
33         /** Canvas to draw the figure */
34         private FigureCanvas canvas;
35         /** Window to draw the figure */
36         private Tab graphicTab;
37         /** store the figureIndex */
38         private int figureId;
39         /** To get all the objects which needs to be destroyed */
40         private ObjectJoGLCleaner destroyedObjects;
41         
42         /**
43          * Default Constructor
44          */
45         public DrawableFigureJoGL() {
46                 super();
47         canvas = null;
48         graphicTab  = null;
49         setColorMap(ColorMap.create());
50         figureId = -1; // figure ids should be greater than 0.
51         destroyedObjects = new ObjectJoGLCleaner();
52     }
53         
54         /**
55          * Set figureId property
56          * @param figureId new figure Id
57          */
58         public void setFigureIndex(int figureId) {
59                 if (FigureMapper.containsFigure(this)) {
60                         FigureMapper.removeMapping(this.figureId);
61                 }
62                 this.figureId = figureId;
63                 FigureMapper.addMapping(figureId, this);
64                 super.setFigureIndex(figureId);
65         }
66         
67         /**
68          * Function called before beginning to use OpenGL methods.
69          * @param parentFigureIndex index of the parent figure.
70          *                          Needed to get the GL context to draw in.
71          */
72         public void initializeDrawing(int parentFigureIndex) {
73                 // destroy all the objects
74                 destroyedObjects.destroyAll(parentFigureIndex);
75                 super.initializeDrawing(parentFigureIndex);
76                 getGL().glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
77         }
78         
79         /**
80          * Function called at the end of the OpenGL use.
81          */
82         public void endDrawing() {
83                 super.endDrawing();
84         }
85   
86         /**
87          * Get the info message used by the figure
88          * @return the info message
89          */
90         public String getInfoMessage() {
91                 return graphicTab.getName();
92         }
93         
94   /**
95    * Display the info message of the figure
96    * @param infoMessage string to display describing the figure
97    */
98   public void setInfoMessage(String infoMessage) {
99     graphicTab.setName(infoMessage);
100   }
101
102   /**
103    * Force the display of the canvas
104    * Called from C to be sure to be in the right context
105    */
106   public void display() {
107           canvas.repaint();
108   }
109   
110   /**
111    * If needed create a new context to draw the figure
112    * @param figureIndex number of the figurewhich will be displayed in the canvas
113    */
114   public void openRenderingCanvas(int figureIndex) {
115       if (canvas != null) { return; }
116       Window graphicView = ScilabWindow.createWindow();
117       graphicView.draw();
118       graphicView.setTitle("Graphic window number " + figureIndex);
119       
120       /* FIGURE */
121       /* Create the tab to put a canvas into */
122       graphicTab = ScilabTab.createTab("");
123       graphicTab.setName("");
124       graphicView.addTab(graphicTab);
125  
126       canvas = FigureCanvas.create();
127       canvas.addGLEventListener(new SciRenderer(figureIndex));
128       graphicTab.addMember(canvas);
129       canvas.display();
130     }
131
132   /**
133    * Destroyr the rendering context
134    */
135   public void closeRenderingCanvas() {
136       if (canvas != null) {
137         FigureMapper.removeMapping(figureId);
138         canvas = null;
139         graphicTab = null;
140       }
141     }
142   
143   /**
144    * Set a new colormap to the figure
145    * @param rgbMat matrix containing the new data. This is a nbColor x 3 matrix
146    *               where 3 is the number of color in the colormap
147    */
148         public void setColorMapData(double[] rgbMat) {
149                 getColorMap().setData(rgbMat);
150         }
151         
152         /**
153          * Get the raw data of the figure colormap
154          * Should only be used by C code
155          * @return colormap data
156          */
157         public double[] getColorMapData() {
158                 return getColorMap().getData();
159         }
160         
161         /**
162          * Get the raw data of the figure colormap
163          * Should only be used by C code
164          * @param data matrix filled with the colormap data
165          */
166         public void getColorMapData(double[] data) {
167                 getColorMap().getData(data);
168         }
169         
170         /**
171          * @return object used to destroy JoGL objects
172          */
173         public ObjectJoGLCleaner getObjectCleaner() {
174                 return destroyedObjects;
175         }
176         
177         /**
178          * Get the canvas in which the figure is drawn
179          * @return canvas in x=which the figur eis drawn or null if none exists
180          */
181         public FigureCanvas getCanvas() { return canvas; }
182         
183         /**
184          * Set the background color of the figure
185          * @param colorIndex index of the colro to use
186          */
187         public void setBackgroundColor(int colorIndex) {
188                 double[] color = getColorMap().getColor(colorIndex);
189                 getGL().glClearColor((float) color[0], (float) color[1], (float) color[2], 1.0f); // alpha is set to 1
190                 getGL().glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
191         }
192         
193         /**
194          * Called when the object is destroyed from C code
195          * @param parentFigureIndex index of parent figure
196          */
197         public void destroy(int parentFigureIndex) {
198                 // figure should not be add to the object cleaner or will destroy themselves.
199                 // no operation for now
200         }
201         
202         
203         /**
204          * @return width of the rendering canvas
205          */
206         public int getCanvasWidth() {
207                 return canvas.getDims().getWidth();
208         }
209         
210         /**
211          * @return height of the rendering canvas
212          */
213         public int getCanvasHeight() {
214                 return canvas.getDims().getHeight();
215         }
216         
217         /**
218          * Set the rendering canvas size.
219          * @param width new width in pixels
220          * @param height new height in pixels
221          */
222         public void setCanvasSize(int width, int height) {
223                 canvas.setDims(new Size(width, height));
224         }
225         
226         /**
227          * @return width of the rendering window
228          */
229         public int getWindowWidth() {
230                 return graphicTab.getDims().getWidth();
231         }
232         
233         /**
234          * @return height of the rendering window
235          */
236         public int getWindowHeight() {
237                 return graphicTab.getDims().getHeight();
238         }
239         
240         /**
241          * Set the rendering window size.
242          * @param width new width in pixels
243          * @param height new height in pixels
244          */
245         public void setWindowSize(int width, int height) {
246                 graphicTab.getDims().setWidth(width);
247                 graphicTab.getDims().setHeight(height);
248         }
249         
250         /**
251          * Get the position of the window enclosing the figure
252          * @return X coordinate in pixels of the window
253          */
254         public int getWindowPosX() {
255                 return graphicTab.getPosition().getX();
256         }
257         
258         /**
259          * Get the position of the window enclosing the figure
260          * @return Y coordinate in pixels of the window
261          */
262         public int getWindowPosY() {
263                 return graphicTab.getPosition().getY();
264         }
265         
266         /**
267          * Get the position of the window enclosing the figure
268          * @param posX X coordinate in pixels of the window
269          * @param posY Y coordinate in pixels of the window
270          */
271         public void setWindowPosition(int posX, int posY) {
272                 graphicTab.getPosition().setX(posX);
273                 graphicTab.getPosition().setY(posY);
274         }
275         
276 }