Datatips: fix offscreen bug (not in datatip mode)
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / datatip / DatatipCreate.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Gustavo Barbosa Libotte
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  *
11  */
12
13 package org.scilab.modules.gui.datatip;
14
15 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_VIEW__;
16
17 import java.util.Arrays;
18 import java.util.LinkedList;
19 import java.util.List;
20
21 import org.scilab.modules.graphic_objects.PolylineData;
22 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
23 import org.scilab.modules.graphic_objects.graphicObject.GraphicObject;
24 import org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties;
25 import org.scilab.modules.graphic_objects.datatip.Datatip;
26 import org.scilab.modules.gui.editor.CommonHandler;
27 import org.scilab.modules.gui.editor.EntityPicker;
28 import org.scilab.modules.renderer.CallRenderer;
29
30 /**
31  * Create a datatip and set its properties
32  * @author Gustavo Barbosa Libotte
33  */
34 public class DatatipCreate {
35
36     static EntityPicker ep = new EntityPicker();
37
38     /**
39      * Given a mouse coordinate point x, y in pixels
40      * create a datatip.
41      *
42      * @param figureUid Figure unique identifier.
43      * @param coordIntX Integer with pixel mouse position x.
44      * @param coordIntY Integer with pixel mouse position y.
45      * @return Datatip handler string.
46      */
47     public static Integer createDatatip(int figureUid, Integer coordIntX, Integer coordIntY) {
48         Integer polylineUid = ep.pick(figureUid, coordIntX, coordIntY);
49         EntityPicker.PickedPoint picked = ep.pickPoint(polylineUid, coordIntX, coordIntY);
50         if (picked.isSegment) {
51             double[] info = EntityPicker.getSegment(figureUid, polylineUid, picked.point, coordIntX, coordIntY);
52             return datatipProperties(info, polylineUid);
53         } else {
54             return datatipProperties(new double[] {picked.point, 0.}, polylineUid);
55         }
56     }
57
58     /**
59      * Given a double graphic coordinate point x, y
60      * create a datatip.
61      *
62      * @param polylineUid Polyline unique identifier.
63      * @param coordDoubleXY double array with graphic position x and y.
64      * @return Datatip.
65      */
66     public static int createDatatipProgramCoord(int polylineUid, double[] coordDoubleXY) {
67         if (polylineUid != 0) {
68             double[] info;
69             if (PolylineData.isZCoordSet(polylineUid) == 0) {
70                 info = EntityPicker.getNearestSegmentIndex(polylineUid, coordDoubleXY[0], coordDoubleXY[1]);
71             } else {
72                 info = EntityPicker.getNearestSegmentIndex(polylineUid, coordDoubleXY[0], coordDoubleXY[1], coordDoubleXY[2]);
73             }
74             return datatipProperties(info, polylineUid);
75         }
76         return 0;
77     }
78
79     /**
80      * Given an integer index that belongs to the polyline create a datatip.
81      *
82      * @param polylineUid Polyline unique identifier.
83      * @param indexPoint integer related to one of the indexed points of the polyline
84      * @return Datatip handler string.
85      */
86     public static int createDatatipProgramIndex(int polylineUid, int indexPoint) {
87         double[] DataX = (double[]) PolylineData.getDataX(polylineUid);
88         double[] DataY = (double[]) PolylineData.getDataY(polylineUid);
89
90         if (indexPoint > DataX.length) {
91             indexPoint = DataX.length;
92         } else if (indexPoint <= 0) {
93             indexPoint = 1;
94         }
95
96         Integer newDatatip = datatipProperties(new double[] {indexPoint - 1, 0}, polylineUid);
97         return newDatatip;
98     }
99
100     /**
101      * Get the datatip position in pixels on a specific axes
102      *
103      * @param coordinates Datatip coordinates x, y in double precision
104      * @param axesUid Axes unique identifier
105      * @return datatip position in pixels
106      */
107     public static int[] getDatatipPositionInteger(double[] coordinates, int axesUid) {
108         double[] graphCoordDouble = new double[] {0.0, 0.0, 0.0};
109         graphCoordDouble[0] = coordinates[0];
110         graphCoordDouble[1] = coordinates[1];
111         graphCoordDouble[2] = 0.0;
112
113         double[] pixelCoordinates = new double[] {0.0, 0.0};
114         pixelCoordinates = CallRenderer.getPixelFrom2dViewCoordinates(axesUid, graphCoordDouble);
115
116         int xInt = (int) pixelCoordinates[0];
117         int yInt = (int) pixelCoordinates[1];
118
119         int[] coordInteger = new int[2];
120         coordInteger[0] = xInt;
121         coordInteger[1] = yInt;
122
123         return coordInteger;
124     }
125
126     /**
127      * Creates and setup the datatip.
128      *
129      * @param coord double array with graphic position x and y.
130      * @param polyline the polyline uid string.
131      * @return Datatip uid string.
132      */
133     private static int datatipProperties(double[] coord, Integer polyline) {
134         GraphicController controller = GraphicController.getController();
135         Integer newDatatip = controller.askObject(GraphicObject.getTypeFromName(GraphicObjectProperties.__GO_DATATIP__));
136         Double[] indexes = null;
137         Integer axesUid = (Integer) controller.getProperty(polyline, GraphicObjectProperties.__GO_PARENT_AXES__);
138         Integer viewInfo = (Integer) controller.getProperty(axesUid, __GO_VIEW__);
139         Integer fg = (Integer)controller.getProperty(polyline, GraphicObjectProperties.__GO_LINE_COLOR__);
140         Integer bg = (Integer)controller.getProperty(polyline, GraphicObjectProperties.__GO_BACKGROUND__);
141         Integer style = (Integer)controller.getProperty(polyline, GraphicObjectProperties.__GO_DATATIP_MARK__);
142
143         //do not set relationship, only set parent to be able to go up in hierarchy
144         controller.setProperty(newDatatip, GraphicObjectProperties.__GO_PARENT__, polyline);
145
146         //set dataIndex and ratio from polyline
147         controller.setProperty(newDatatip, GraphicObjectProperties.__GO_DATATIP_INDEXES__, new Double[] {coord[0], coord[1]});
148
149         //set colors
150         controller.setProperty(newDatatip, GraphicObjectProperties.__GO_MARK_FOREGROUND__, fg);
151         controller.setProperty(newDatatip, GraphicObjectProperties.__GO_MARK_BACKGROUND__, bg);
152
153         //set style
154         controller.setProperty(newDatatip, GraphicObjectProperties.__GO_MARK_STYLE__, style);
155
156         //get current polyline datatips
157         Integer[] tips = (Integer[]) controller.getProperty(polyline, GraphicObjectProperties.__GO_DATATIPS__);
158
159         //insert new tip in children array
160         List<Integer> l = new LinkedList<Integer>(Arrays.asList(tips));
161         l.add(0, newDatatip);
162
163         //set new datatips arry in polyline
164         Integer[] var = new Integer[l.size()];
165         l.toArray(var);
166         controller.setProperty(polyline, GraphicObjectProperties.__GO_DATATIPS__, var);
167
168         if (viewInfo == 1 && PolylineData.isZCoordSet(polyline) == 1) {
169             controller.setProperty(newDatatip, GraphicObjectProperties.__GO_DATATIP_3COMPONENT__, true);
170             controller.setProperty(newDatatip, GraphicObjectProperties.__GO_CLIP_STATE__, 0);
171         }
172
173         if (DatatipManagerMode.getInstance() != null) {
174             DatatipManagerMode.getInstance().setLastTip(axesUid, newDatatip);
175         }
176
177         return newDatatip;
178     }
179
180     /**
181      * Set the datatip interpolation mode.
182      *
183      * @param datatipUid datatip unique identifier.
184      * @param interpMode boolean for the interpolation mode.
185      */
186     public static void datatipSetInterp(int uid, boolean interpMode) {
187         GraphicController controller = GraphicController.getController();
188         Object o = controller.getObjectFromId(uid);
189         if (o instanceof Datatip) {
190             controller.setProperty(uid, GraphicObjectProperties.__GO_DATATIP_INTERP_MODE__, interpMode);
191         } else {
192             Integer[] tips = (Integer[]) controller.getProperty(uid, GraphicObjectProperties.__GO_DATATIPS__);
193             Boolean b = new Boolean(interpMode);
194             for (int i = 0; i < tips.length; i++) {
195                 controller.setProperty(tips[i], GraphicObjectProperties.__GO_DATATIP_INTERP_MODE__, b);
196             }
197         }
198     }
199 }