2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2012 - Gustavo Barbosa Libotte
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
13 package org.scilab.modules.gui.datatip;
15 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_VIEW__;
17 import java.util.Arrays;
18 import java.util.LinkedList;
19 import java.util.List;
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;
31 * Create a datatip and set its properties
32 * @author Gustavo Barbosa Libotte
34 public class DatatipCreate {
36 static EntityPicker ep = new EntityPicker();
39 * Given a mouse coordinate point x, y in pixels
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.
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);
54 return datatipProperties(new double[] {picked.point, 0.}, polylineUid);
59 * Given a double graphic coordinate point x, y
62 * @param polylineUid Polyline unique identifier.
63 * @param coordDoubleXY double array with graphic position x and y.
66 public static int createDatatipProgramCoord(int polylineUid, double[] coordDoubleXY) {
67 if (polylineUid != 0) {
69 if (PolylineData.isZCoordSet(polylineUid) == 0) {
70 info = EntityPicker.getNearestSegmentIndex(polylineUid, coordDoubleXY[0], coordDoubleXY[1]);
72 info = EntityPicker.getNearestSegmentIndex(polylineUid, coordDoubleXY[0], coordDoubleXY[1], coordDoubleXY[2]);
74 return datatipProperties(info, polylineUid);
80 * Given an integer index that belongs to the polyline create a datatip.
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.
86 public static int createDatatipProgramIndex(int polylineUid, int indexPoint) {
87 double[] DataX = (double[]) PolylineData.getDataX(polylineUid);
88 double[] DataY = (double[]) PolylineData.getDataY(polylineUid);
90 if (indexPoint > DataX.length) {
91 indexPoint = DataX.length;
92 } else if (indexPoint <= 0) {
96 Integer newDatatip = datatipProperties(new double[] {indexPoint - 1, 0}, polylineUid);
101 * Get the datatip position in pixels on a specific axes
103 * @param coordinates Datatip coordinates x, y in double precision
104 * @param axesUid Axes unique identifier
105 * @return datatip position in pixels
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;
113 double[] pixelCoordinates = new double[] {0.0, 0.0};
114 pixelCoordinates = CallRenderer.getPixelFrom2dViewCoordinates(axesUid, graphCoordDouble);
116 int xInt = (int) pixelCoordinates[0];
117 int yInt = (int) pixelCoordinates[1];
119 int[] coordInteger = new int[2];
120 coordInteger[0] = xInt;
121 coordInteger[1] = yInt;
127 * Creates and setup the datatip.
129 * @param coord double array with graphic position x and y.
130 * @param polyline the polyline uid string.
131 * @return Datatip uid string.
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__);
143 //do not set relationship, only set parent to be able to go up in hierarchy
144 controller.setProperty(newDatatip, GraphicObjectProperties.__GO_PARENT__, polyline);
146 //set dataIndex and ratio from polyline
147 controller.setProperty(newDatatip, GraphicObjectProperties.__GO_DATATIP_INDEXES__, new Double[] {coord[0], coord[1]});
150 controller.setProperty(newDatatip, GraphicObjectProperties.__GO_MARK_FOREGROUND__, fg);
151 controller.setProperty(newDatatip, GraphicObjectProperties.__GO_MARK_BACKGROUND__, bg);
154 controller.setProperty(newDatatip, GraphicObjectProperties.__GO_MARK_STYLE__, style);
156 //get current polyline datatips
157 Integer[] tips = (Integer[]) controller.getProperty(polyline, GraphicObjectProperties.__GO_DATATIPS__);
159 //insert new tip in children array
160 List<Integer> l = new LinkedList<Integer>(Arrays.asList(tips));
161 l.add(0, newDatatip);
163 //set new datatips arry in polyline
164 Integer[] var = new Integer[l.size()];
166 controller.setProperty(polyline, GraphicObjectProperties.__GO_DATATIPS__, var);
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);
173 if (DatatipManagerMode.getInstance() != null) {
174 DatatipManagerMode.getInstance().setLastTip(axesUid, newDatatip);
181 * Set the datatip interpolation mode.
183 * @param datatipUid datatip unique identifier.
184 * @param interpMode boolean for the interpolation mode.
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);
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);