530cce3a91dfe3cfc0e69c7a1142a7afc94d2817
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / editor / LegendHandler.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.util.Arrays;
17 import java.util.List;
18 import java.util.ArrayList;
19 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
20 import org.scilab.modules.graphic_objects.graphicObject.GraphicObject;
21 import org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties;
22
23 import org.scilab.modules.gui.editor.ObjectSearcher;
24 import org.scilab.modules.gui.editor.PolylineHandler;
25
26
27 /**
28 * Implements all legend manipulation functions for the editor.
29 *
30 * @author Caio Souza <caioc2bolado@gmail.com>
31 * @author Pedro Souza <bygrandao@gmail.com>
32 *
33 * @since 2012-06-01
34 */
35 public class LegendHandler {
36
37     public static Integer searchLegend(Integer uid) {
38
39         if (uid == null) {
40             return null;
41         }
42         Integer childCount = (Integer)GraphicController.getController().getProperty(uid, GraphicObjectProperties.__GO_CHILDREN_COUNT__);
43         Integer[] child = (Integer[])GraphicController.getController().getProperty(uid, GraphicObjectProperties.__GO_CHILDREN__);
44         for (Integer i = 0; i < childCount; i++) {
45             Integer type = (Integer)GraphicController.getController().getProperty(child[i], GraphicObjectProperties.__GO_TYPE__);
46             if (type == GraphicObjectProperties.__GO_LEGEND__) {
47                 return child[i];
48             }
49         }
50         return null;
51     }
52
53     /**
54     * Set or create a legend for one polyline.
55     *
56     * @param axes The axes that will recieve the legend.
57     * @param polyline The polyline to set/create legend.
58     * @param text The text for the legend.
59     */
60
61     public static void setLegend(Integer axes, Integer polyline, String text) {
62
63         if (text == null || text == "" || polyline == null || axes == null) {
64             return;
65         }
66         Integer legend = searchLegend(axes);
67         Integer[] dimension = { 0, 0 };
68         ArrayList<String> texts = new ArrayList<String>();
69         ArrayList<Integer> links = new ArrayList<Integer>();
70         texts.add(text);
71         if (legend != null) {
72             String[] textOld = (String[])GraphicController.getController().getProperty(legend, GraphicObjectProperties.__GO_TEXT_STRINGS__);
73             Integer[] linksOld = (Integer[])GraphicController.getController().getProperty(legend, GraphicObjectProperties.__GO_LINKS__);
74             Integer length = linksOld.length;
75             for (Integer i = 0; i < length; i++) {
76                 if (polyline != linksOld[i]) {
77                     texts.add(textOld[i]);
78                     links.add(linksOld[i]);
79                 } else {
80                     removeLegend(axes, polyline);
81                     setLegend(axes, polyline, text);
82                     return;
83                 }
84             }
85             CommonHandler.delete(legend);
86         }
87         legend = GraphicController.getController().askObject(GraphicObject.getTypeFromName(GraphicObjectProperties.__GO_LEGEND__));
88         GraphicController.getController().setGraphicObjectRelationship(axes, legend);
89
90         links.add(polyline);
91         String[] textToSet = new String[texts.size()];
92         texts.toArray(textToSet);
93         Integer[] linksToSet = new Integer[links.size()];
94         links.toArray(linksToSet);
95         dimension[0] = linksToSet.length;
96         dimension[1] = 1;
97         if (dimension[0] != 0) {
98             GraphicController.getController().setProperty(legend, GraphicObjectProperties.__GO_TEXT_ARRAY_DIMENSIONS__, dimension);
99             GraphicController.getController().setProperty(legend, GraphicObjectProperties.__GO_LINE_MODE__, true);
100             GraphicController.getController().setProperty(legend, GraphicObjectProperties.__GO_TEXT_STRINGS__, textToSet);
101             GraphicController.getController().setProperty(legend, GraphicObjectProperties.__GO_LINKS__, linksToSet);
102             GraphicController.getController().setProperty(legend, GraphicObjectProperties.__GO_LEGEND_LOCATION__, 0);
103         }
104     }
105
106     /**
107     * Remove a legend from axes.
108     *
109     * @param axes The axes to remove the legend.
110     * @param polyline The polyline that is linked to the legend.
111     */
112
113     public static void removeLegend(Integer axes, Integer polyline) {
114
115         if (polyline == null || axes == null) {
116             return;
117         }
118         Integer legend = searchLegend(axes);
119         Integer[] dimension = { 0, 0 };
120         ArrayList<String> texts = new ArrayList<String>();
121         ArrayList<Integer> links = new ArrayList<Integer>();
122         if (legend == null) {
123             return;
124         } else {
125             String[] textOld = (String[])GraphicController.getController().getProperty(legend, GraphicObjectProperties.__GO_TEXT_STRINGS__);
126             Integer[] linksOld = (Integer[])GraphicController.getController().getProperty(legend, GraphicObjectProperties.__GO_LINKS__);
127             Integer remove = -1;
128             for (Integer i = 0; i < linksOld.length; i++) {
129                 if (polyline != linksOld[i]) {
130                     links.add(linksOld[i]);
131                 } else {
132                     remove = i;
133                 }
134             }
135             for (Integer i = 0; i < textOld.length; i++) {
136                 if (i != (textOld.length - remove - 1)) {
137                     texts.add(textOld[i]);
138                 }
139             }
140         }
141         String[] textToSet = new String[texts.size()];
142         texts.toArray(textToSet);
143         Integer[] linksToSet = new Integer[links.size()];
144         links.toArray(linksToSet);
145         dimension[0] = linksToSet.length;
146         dimension[1] = 1;
147         if (dimension[0] != 0) {
148             GraphicController.getController().setProperty(legend, GraphicObjectProperties.__GO_TEXT_ARRAY_DIMENSIONS__, dimension);
149             GraphicController.getController().setProperty(legend, GraphicObjectProperties.__GO_LINE_MODE__, true);
150             GraphicController.getController().setProperty(legend, GraphicObjectProperties.__GO_TEXT_STRINGS__, textToSet);
151             GraphicController.getController().setProperty(legend, GraphicObjectProperties.__GO_LINKS__, linksToSet);
152             GraphicController.getController().setProperty(legend, GraphicObjectProperties.__GO_LEGEND_LOCATION__, 0);
153         } else {
154             CommonHandler.delete(legend);
155         }
156     }
157
158     /**
159     * Get the text of the legend.
160     *
161     * @param axes The axes where is the legend.
162     * @param polyline The polyline that is linked to the legend.
163     * @return The text of the legend.
164     */
165
166     public static String getLegendText(Integer axes, Integer polyline) {
167
168         if (polyline != null && axes != null) {
169             Integer legend = searchLegend(axes);
170             if (legend == null) {
171                 return null;
172             } else {
173                 String[] textOld = (String[])GraphicController.getController().getProperty(legend, GraphicObjectProperties.__GO_TEXT_STRINGS__);
174                 Integer[] linksOld = (Integer[])GraphicController.getController().getProperty(legend, GraphicObjectProperties.__GO_LINKS__);
175                 for (Integer i = 0; i < linksOld.length; i++) {
176                     if (linksOld[i] == polyline) {
177                         return textOld[linksOld.length - i - 1];
178                     }
179                 }
180             }
181         }
182         return null;
183     }
184
185     /**
186     * Drag the given legend.
187     *
188     * @param legend  the legend uid.
189     * @param position click position (x,y).
190     * @param nextPosition dragged position (x,y).
191     */
192
193     public static void dragLegend(Integer legend, Integer[] position, Integer[] nextPosition) {
194
195         ObjectSearcher searcher = new ObjectSearcher();
196         Integer axes = searcher.searchParent(legend, GraphicObjectProperties.__GO_AXES__);
197         Integer figure = searcher.searchParent(legend, GraphicObjectProperties.__GO_FIGURE__);
198         Integer[] axesSize = { 0, 0 };
199         Double[] axesBounds = { 0., 0. }, diff = { 0., 0. }, legendPos = { 0., 0. };
200         if (legend == null || axes == null || figure == null) {
201             return;
202         }
203
204         axesSize = (Integer[])GraphicController.getController().getProperty(figure, GraphicObjectProperties.__GO_AXES_SIZE__);
205         axesBounds = (Double[])GraphicController.getController().getProperty(axes, GraphicObjectProperties.__GO_AXES_BOUNDS__);
206         legendPos = (Double[])GraphicController.getController().getProperty(legend, GraphicObjectProperties.__GO_POSITION__);
207         if ( nextPosition[0] > (axesSize[0] - 10) || nextPosition[1] > (axesSize[1] - 10)) {
208             return;
209         }
210         diff[0] = (nextPosition[0] - position[0]) / (axesBounds[2] * axesSize[0]);
211         diff[1] = (nextPosition[1] - position[1]) / (axesBounds[3] * axesSize[1]);
212         legendPos[0] += diff[0];
213         legendPos[1] += diff[1];
214         GraphicController.getController().setProperty(legend, GraphicObjectProperties.__GO_LEGEND_LOCATION__, 10);
215         GraphicController.getController().setProperty(legend, GraphicObjectProperties.__GO_POSITION__, legendPos);
216     }
217
218     /**
219     * Get the links of a Legend
220     *
221     * @param legend The legend to get the links
222     * @return Links of the legend
223     */
224     public static Integer[] getLinks(Integer legend) {
225
226         if (legend == null) {
227             return null;
228         } else {
229             return (Integer[])GraphicController.getController().getProperty(legend, GraphicObjectProperties.__GO_LINKS__);
230         }
231     }
232
233     /**
234     * Get the text of a Legend
235     *
236     * @param legend The legend to get the text
237     * @return Text of the legend
238     */
239     public static String[] getText(Integer legend) {
240
241         if (legend == null) {
242             return null;
243         } else {
244             return (String[])GraphicController.getController().getProperty(legend, GraphicObjectProperties.__GO_TEXT_STRINGS__);
245         }
246     }
247
248     /**
249     * Get the position of a Legend
250     *
251     * @param legend The legend to get the position
252     * @return The legend position
253     */
254     public static Double[] getPosition(Integer legend) {
255
256         if (legend == null) {
257             return null;
258         } else {
259             return (Double[])GraphicController.getController().getProperty(legend, GraphicObjectProperties.__GO_POSITION__);
260         }
261     }
262 }