abca19a6dbbb9b9c378000b7bca0bf86d82a3e4c
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / editor / AxesHandler.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Pedro Arthur dos S. Souza
4  * Copyright (C) 2012 - Caio Lucas dos S. Souza
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.gui.editor;
15
16 import java.lang.Math;
17
18 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
19 import org.scilab.modules.graphic_objects.graphicModel.GraphicModel;
20 import org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties;
21 import org.scilab.modules.graphic_objects.axes.Axes;
22 import org.scilab.modules.graphic_objects.axes.AxesContainer;
23 import org.scilab.modules.graphic_objects.ScilabNativeView;
24
25 import org.scilab.modules.gui.editor.ObjectSearcher;
26 import org.scilab.modules.gui.editor.PolylineHandler;
27
28 /**
29 * Implements all axes manipulation functions for the editor.
30 *
31 * @author Caio Souza <caioc2bolado@gmail.com>
32 * @author Pedro Souza <bygrandao@gmail.com>
33 *
34 * @since 2012-06-01
35 */
36 public class AxesHandler {
37
38     public enum axisTo { __X__, __Y__, __Z__, __TITLE__ };
39
40     private static Integer lastAxes;
41
42     private static Integer[] searchAxes(Integer uid) {
43         return (new ObjectSearcher()).search(uid, GraphicObjectProperties.__GO_AXES__);
44     }
45
46     public static Axes getAxesFromUid(Integer uid) {
47         return (Axes)GraphicController.getController().getObjectFromId(uid);
48     }
49
50     /**
51     * Given a mouse coordinate point (x, y) in pixels
52     * retrieves the axes wich the point belongs.
53     *
54     * @param figure Figure unique identifier.
55     * @param position Vector with mouse position x and y.
56     * @return Retrieved axes or null if there isn't an axes.
57     */
58     public static Integer clickedAxes(Integer figure, Integer[] position) {
59         Integer[] axes = searchAxes(figure);
60         if (axes == null) {
61             return lastAxes;
62         }
63
64         AxesContainer container = (AxesContainer) GraphicController.getController().getObjectFromId(figure);
65         Integer[] figureSize = container.getAxesSize();
66
67         for (Integer i = 0; i < axes.length; i++) {
68             Double[] axesBound = (Double[])GraphicController.getController().getProperty(axes[i], GraphicObjectProperties.__GO_AXES_BOUNDS__);
69             Double xi, xf, yi, yf;
70
71             xi = (figureSize[0] * axesBound[0]);
72             xf = (figureSize[0] * (axesBound[0] + axesBound[2]));
73             yi = (figureSize[1] * axesBound[1]);
74             yf = (figureSize[1] * (axesBound[1] + axesBound[3]));
75
76             if (position[0] > xi && position[0] < xf && position[1] > yi && position[1] < yf) {
77                 lastAxes = axes[i];
78                 return axes[i];
79             }
80         }
81         return lastAxes;
82     }
83
84
85
86     /**
87      * Change the status from the axes to visible and the axis too
88      *
89      * @param axes Axes to set visible
90      */
91     public static void setAxesVisible(Integer axes) {
92
93         GraphicController.getController().setProperty(axes, GraphicObjectProperties.__GO_X_AXIS_VISIBLE__, true);
94         GraphicController.getController().setProperty(axes, GraphicObjectProperties.__GO_Y_AXIS_VISIBLE__, true);
95         GraphicController.getController().setProperty(axes, GraphicObjectProperties.__GO_Z_AXIS_VISIBLE__, true);
96         GraphicController.getController().setProperty(axes, GraphicObjectProperties.__GO_VISIBLE__, true);
97         GraphicController.getController().setProperty(axes, GraphicObjectProperties.__GO_CLIP_STATE__, 1);
98         GraphicController.getController().setProperty(axes, GraphicObjectProperties.__GO_TIGHT_LIMITS__, true);
99         GraphicController.getController().setProperty(axes, GraphicObjectProperties.__GO_BOX_TYPE__, 1);
100         GraphicController.getController().setProperty(axes, GraphicObjectProperties.__GO_FILLED__, true);
101     }
102
103     /**
104      * Clone an axes and delete all their children's, change the labels from axes to empty
105      *
106      * @param axes The axes to duplicate
107      * @return Return a duplicated axes without childrens
108      */
109     public static Integer duplicateAxes(Integer axes) {
110
111         Integer newAxes = GraphicController.getController().cloneObject(axes);
112         setAxesVisible(newAxes);
113         PolylineHandler.getInstance().deleteAll(newAxes);
114         return newAxes;
115     }
116
117     /**
118      * Set the AxesTo bounds with the max bounds between axesFrom
119      * and axesTo(used when paste new objects to make all object visible)
120      *
121      * @param axesFrom Axes from you want to merge the bounds
122      * @param axesTo Axes that will be set the max bounds between the two axes
123      */
124     public static void axesBound(Integer axesFrom, Integer axesTo) {
125
126         if (axesFrom == axesTo) {
127             return;
128         }
129
130         Double[] axesFB = (Double[])GraphicController.getController().getProperty(axesFrom, GraphicObjectProperties.__GO_DATA_BOUNDS__);
131         Double[] axesTB = (Double[])GraphicController.getController().getProperty(axesTo, GraphicObjectProperties.__GO_REAL_DATA_BOUNDS__);
132         Double[] newBounds = {0., 0., 0., 0., 0., 0.};
133
134         newBounds[0] = Math.min(axesFB[0], axesTB[0]);
135         newBounds[1] = Math.max(axesFB[1], axesTB[1]);
136         newBounds[2] = Math.min(axesFB[2], axesTB[2]);
137         newBounds[3] = Math.max(axesFB[3], axesTB[3]);
138         newBounds[4] = Math.min(axesFB[4], axesTB[4]);
139         newBounds[5] = Math.max(axesFB[5], axesTB[5]);
140
141         GraphicController.getController().setProperty(axesTo, GraphicObjectProperties.__GO_DATA_BOUNDS__, newBounds);
142
143         Boolean tight_lim = (Boolean)GraphicController.getController().getProperty(axesFrom, GraphicObjectProperties.__GO_TIGHT_LIMITS__);
144         GraphicController.getController().setProperty(axesTo, GraphicObjectProperties.__GO_TIGHT_LIMITS__, tight_lim);
145     }
146
147     /**
148      * Checks if zoombox is enebled in the given axes.
149      *
150      * @param uid axes unique identifier.
151      * @return True if enabled, false otherwise.
152      */
153     public static Boolean isZoomBoxEnabled(Integer uid) {
154         return (Boolean)GraphicController.getController().getProperty(uid, GraphicObjectProperties.__GO_ZOOM_ENABLED__);
155     }
156
157     /**
158      * Checks if the given point (x,y) is in zoombox bounds.
159      *
160      * @param uid Axes unique identifier.
161      * @param x position on x axis.
162      * @param y position on y axis.
163      * @return True if the point is within the bounds, false otherwise.
164      */
165     public static Boolean isInZoomBoxBounds(Integer uid, double x, double y) {
166         Double[] bounds = (Double[])GraphicController.getController().getProperty(uid, GraphicObjectProperties.__GO_ZOOM_BOX__);
167         if (x >= bounds[0] && x <= bounds[1]) {
168             if (y >= bounds[2] && y <= bounds[3]) {
169                 return true;
170             }
171         }
172         return false;
173     }
174
175     /**
176      * Checks if the given figure have any object visible.
177      *
178      * @param figure Figure unique identifier.
179      * @return True if there is any object visible, false otherwise.
180      */
181     public static boolean isAxesNotBlank(Integer figure) {
182
183         Integer[] axes = searchAxes(figure);
184         if (axes == null) {
185             return false;
186         }
187         boolean flag = false;
188         for ( Integer j = 0; j < axes.length; j++) {
189
190             Integer childCount = (Integer)GraphicController.getController().getProperty(axes[j], GraphicObjectProperties.__GO_CHILDREN_COUNT__);
191             Integer[] child = (Integer[])GraphicController.getController().getProperty(axes[j], GraphicObjectProperties.__GO_CHILDREN__);
192             for (Integer i = 0; i < childCount; i++) {
193                 flag = isBlank(child[i]);
194                 if (flag) {
195                     return flag;
196                 }
197             }
198         }
199         return false;
200     }
201
202     public static boolean isAxesEmpty(Integer axes) {
203
204         Integer childCount = (Integer)GraphicController.getController().getProperty(axes, GraphicObjectProperties.__GO_CHILDREN_COUNT__);
205         Integer[] child = (Integer[])GraphicController.getController().getProperty(axes, GraphicObjectProperties.__GO_CHILDREN__);
206         for (Integer i = 0; i < childCount; i++) {
207             Integer type = (Integer)GraphicController.getController().getProperty(child[i], GraphicObjectProperties.__GO_TYPE__);
208             if (type != GraphicObjectProperties.__GO_LABEL__) {
209                 return false;
210             }
211         }
212         return true;
213     }
214
215     /**
216      * Checks if the given object is visible or if it has child check its children.
217      *
218      * @param objectID Object unique identifier.
219      * @return True if there is any object visible, false otherwise.
220      */
221     private static boolean isBlank(Integer objectID) {
222
223         Integer type = (Integer)GraphicController.getController().getProperty(objectID, GraphicObjectProperties.__GO_TYPE__);
224         boolean flag = (Boolean) GraphicController.getController().getProperty(objectID, GraphicObjectProperties.__GO_VISIBLE__);
225         if (flag) {
226             if (type != GraphicObjectProperties.__GO_LABEL__ && type != GraphicObjectProperties.__GO_COMPOUND__) {
227                 return flag;
228             } else if (type == GraphicObjectProperties.__GO_COMPOUND__) {
229                 Integer childCount = (Integer)GraphicController.getController().getProperty(objectID, GraphicObjectProperties.__GO_CHILDREN_COUNT__);
230                 Integer[] child = (Integer[])GraphicController.getController().getProperty(objectID, GraphicObjectProperties.__GO_CHILDREN__);
231                 for (Integer i = 0; i < childCount; i++) {
232                     flag = (Boolean) GraphicController.getController().getProperty(child[i], GraphicObjectProperties.__GO_VISIBLE__);
233                     if (flag) {
234                         return flag;
235                     }
236                 }
237             }
238         }
239         return false;
240     }
241
242     public static void pasteRotationAngles(Integer obj, Integer figure, Integer[] pos) {
243
244         Integer axesFrom = (new ObjectSearcher()).searchParent(obj, GraphicObjectProperties.__GO_AXES__);
245         Integer axesTo = AxesHandler.clickedAxes(figure, pos);
246
247         Double[] angles = (Double[])GraphicController.getController().getProperty(axesFrom, GraphicObjectProperties.__GO_ROTATION_ANGLES__);
248         GraphicController.getController().setProperty(axesTo, GraphicObjectProperties.__GO_ROTATION_ANGLES__, angles);
249     }
250
251     /**
252     * Clone an axes with the same properties from the original
253     *
254     * @param axesFromUID The uid from the axes to clone
255     * @return The cloned axes UID
256     */
257     public static Integer cloneAxesWithStyle(Integer axesFromUID) {
258
259         Integer cloneUID = GraphicController.getController().cloneObject(axesFromUID);
260         Axes clone = (Axes)GraphicController.getController().getObjectFromId(cloneUID);
261         Axes axesFrom = (Axes)GraphicController.getController().getObjectFromId(axesFromUID);
262
263         //Cloning the Axes does not clone the labels/title, so we need do it manualy
264
265         Integer xLabelUID = GraphicController.getController().cloneObject(axesFrom.getXAxisLabel());
266         Integer yLabelUID = GraphicController.getController().cloneObject(axesFrom.getYAxisLabel());
267         Integer zLabelUID = GraphicController.getController().cloneObject(axesFrom.getZAxisLabel());
268         Integer titleUID = GraphicController.getController().cloneObject(axesFrom.getTitle());
269
270         GraphicController.getController().setGraphicObjectRelationship(cloneUID, xLabelUID);
271         GraphicController.getController().setGraphicObjectRelationship(cloneUID, yLabelUID);
272         GraphicController.getController().setGraphicObjectRelationship(cloneUID, zLabelUID);
273         GraphicController.getController().setGraphicObjectRelationship(cloneUID, titleUID);
274
275         //Set the correct position to the labels/title in the new Axes
276
277         GraphicController.getController().setProperty(xLabelUID, GraphicObjectProperties.__GO_AUTO_POSITION__, true);
278         GraphicController.getController().setProperty(yLabelUID, GraphicObjectProperties.__GO_AUTO_POSITION__, true);
279         GraphicController.getController().setProperty(zLabelUID, GraphicObjectProperties.__GO_AUTO_POSITION__, true);
280         GraphicController.getController().setProperty(titleUID, GraphicObjectProperties.__GO_AUTO_POSITION__, true);
281
282         Double[] margins = axesFrom.getMargins();
283         Integer boxType = axesFrom.getBoxType();
284         boolean markMode = axesFrom.getMarkMode();
285         Integer clipState = axesFrom.getClipState();
286         Integer markSize = axesFrom.getMarkSize();
287         Integer markStyle = axesFrom.getMarkStyle();
288         Integer markForeground = axesFrom.getMarkForeground();
289         Integer markBackground = axesFrom.getMarkBackground();
290         boolean lineMode = axesFrom.getLineMode();
291         Integer lineStyle = axesFrom.getLineStyle();
292         Double lineThickness = axesFrom.getLineThickness();
293         Integer lineColor = axesFrom.getLineColor();
294         Double[] rotationAngles = axesFrom.getRotationAngles();
295         boolean XAxisVisible = axesFrom.getXAxisVisible();
296         boolean YAxisVisible = axesFrom.getYAxisVisible();
297         boolean ZAxisVisible = axesFrom.getZAxisVisible();
298         boolean XAxisReverse = axesFrom.getXAxisReverse();
299         boolean YAxisReverse = axesFrom.getYAxisReverse();
300         boolean ZAxisReverse = axesFrom.getZAxisReverse();
301         Integer XAxisGridColor = axesFrom.getXAxisGridColor();
302         Integer YAxisGridColor = axesFrom.getYAxisGridColor();
303         Integer ZAxisGridColor = axesFrom.getZAxisGridColor();
304         Integer fontStyle = axesFrom.getFontStyle();
305         Double fontSize = axesFrom.getFontSize();
306         Integer fontColor = axesFrom.getFontColor();
307         boolean fontFractional = axesFrom.getFontFractional();
308         Integer hiddenColor = axesFrom.getHiddenColor();
309         boolean tightLimits = axesFrom.getTightLimits();
310
311         clone.setXAxisLabel(xLabelUID);
312         clone.setYAxisLabel(yLabelUID);
313         clone.setZAxisLabel(zLabelUID);
314         clone.setTitle(titleUID);
315
316         clone.setMargins(margins);
317         clone.setBoxType(boxType);
318         clone.setClipState(clipState);
319         clone.setMarkMode(markMode);
320         clone.setMarkStyle(markStyle);
321         clone.setMarkSize(markSize);
322         clone.setMarkBackground(markBackground);
323         clone.setMarkForeground(markForeground);
324         clone.setLineMode(lineMode);
325         clone.setLineStyle(lineStyle);
326         clone.setLineThickness(lineThickness);
327         clone.setLineColor(lineColor);
328
329
330         clone.setRotationAngles(rotationAngles);
331         clone.setXAxisVisible(XAxisVisible);
332         clone.setYAxisVisible(YAxisVisible);
333         clone.setZAxisVisible(ZAxisVisible);
334         clone.setXAxisReverse(XAxisReverse);
335         clone.setYAxisReverse(YAxisReverse);
336         clone.setZAxisReverse(ZAxisReverse);
337         clone.setXAxisGridColor(XAxisGridColor);
338         clone.setYAxisGridColor(YAxisGridColor);
339         clone.setZAxisGridColor(ZAxisGridColor);
340         clone.setFontStyle(fontStyle);
341         clone.setFontSize(fontSize);
342         clone.setFontColor(fontColor);
343         clone.setFontFractional(fontFractional);
344         clone.setHiddenColor(hiddenColor);
345         clone.setTightLimits(tightLimits);
346
347         return cloneUID;
348     }
349
350     /**
351     * Cuts the original from the figure, paste the new axes in the figure and copy
352     * the childrens, data bounds and title from the original axes to the new one
353     *
354     * @param newAxesUID The uid from the new axes to paste
355     * @param axesToUID The uid from the axes to be cut
356     */
357     public static void pasteAxesStyle(Integer newAxesUID, Integer axesToUID, boolean bounds) {
358
359         if (newAxesUID == null || axesToUID == null) {
360             return;
361         }
362         Axes newAxes = (Axes)GraphicController.getController().getObjectFromId(newAxesUID);
363         Axes axesTo = (Axes)GraphicController.getController().getObjectFromId(axesToUID);
364
365         Integer[] children = axesTo.getChildren();
366         Integer parentUID = axesTo.getParent();
367         String[] titleText = (String[])GraphicController.getController().getProperty(axesTo.getTitle(), GraphicObjectProperties.__GO_TEXT_STRINGS__);
368         String[] xLabelText = (String[])GraphicController.getController().getProperty(axesTo.getXAxisLabel(), GraphicObjectProperties.__GO_TEXT_STRINGS__);
369         String[] yLabelText = (String[])GraphicController.getController().getProperty(axesTo.getYAxisLabel(), GraphicObjectProperties.__GO_TEXT_STRINGS__);
370         String[] zLabelText = (String[])GraphicController.getController().getProperty(axesTo.getZAxisLabel(), GraphicObjectProperties.__GO_TEXT_STRINGS__);
371
372         GraphicController.getController().setProperty(newAxes.getTitle(), GraphicObjectProperties.__GO_TEXT_STRINGS__, titleText);
373         GraphicController.getController().setProperty(newAxes.getXAxisLabel(), GraphicObjectProperties.__GO_TEXT_STRINGS__, xLabelText);
374         GraphicController.getController().setProperty(newAxes.getYAxisLabel(), GraphicObjectProperties.__GO_TEXT_STRINGS__, yLabelText);
375         GraphicController.getController().setProperty(newAxes.getZAxisLabel(), GraphicObjectProperties.__GO_TEXT_STRINGS__, zLabelText);
376
377         if (bounds) {
378             Double[] dataBounds = axesTo.getDataBounds();
379             Double[] realDataBounds = axesTo.getRealDataBounds();
380             newAxes.setDataBounds(dataBounds);
381             newAxes.setRealDataBounds(realDataBounds);
382         }
383
384         for (Integer i = 0; i < children.length; i++) {
385             GraphicController.getController().setGraphicObjectRelationship(newAxesUID, children[i]);
386         }
387         GraphicController.getController().setGraphicObjectRelationship(parentUID, newAxesUID);
388         GraphicController.getController().setGraphicObjectRelationship(0, axesToUID);
389         ScilabNativeView.ScilabNativeView__setCurrentSubWin(newAxesUID);
390     }
391 }
392