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