Graphics: avoid useless operations
[scilab.git] / scilab / modules / graphic_objects / src / java / org / scilab / modules / graphic_objects / textObject / TextObject.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010-2011 - DIGITEO - Manuel JULIACHS
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-en.txt
10  *
11  */
12
13 package org.scilab.modules.graphic_objects.textObject;
14
15 import org.scilab.modules.graphic_objects.contouredObject.ContouredObject;
16
17 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_FONT_COLOR__;
18 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_FONT_FRACTIONAL__;
19 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_FONT_SIZE__;
20 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_FONT_STYLE__;
21 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_FORMATTED_TEXT__;
22 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_TEXT_ARRAY_DIMENSIONS__;
23 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_TEXT_STRINGS__;
24
25
26 /**
27  * TextObject class
28  * @author Manuel JULIACHS
29  */
30 public abstract class TextObject extends ContouredObject {
31     /** TextObject properties names */
32     protected enum TextObjectProperty { TEXT, TEXT_ARRAY_DIMENSIONS };
33
34     /**
35      * Formatted text objects array, row-major order.
36      * For now, elements are supposed to have identical font properties values,
37      * hence the current associated get/set methods implementation.
38      */
39     protected FormattedText[] text;
40
41     /** Text array dimensions (number of rows, number of columns) */
42     private int[] dimensions;
43
44     /** Constructor */
45     public TextObject() {
46         super();
47
48         dimensions = new int[2];
49         dimensions[0] = 1;
50         dimensions[1] = 1;
51
52         text = new FormattedText[1];
53         text[0] = new FormattedText();
54     }
55
56     /**
57      * Clone method
58      */
59     public TextObject clone() {
60         TextObject copy = (TextObject) super.clone();
61
62         copy.dimensions = new int[2];
63         copy.dimensions[0] = dimensions[0];
64         copy.dimensions[1] = dimensions[1];
65         copy.text = new FormattedText[dimensions[0] * dimensions[1]];
66
67         /* Actually copies the FormattedText objects */
68         copy.setText(text);
69
70         return copy;
71     }
72
73     /**
74      * @return true if we have an empty label
75      */
76     public boolean isEmpty() {
77         for (int i = 0; i < dimensions[0] * dimensions[1]; i++) {
78             String s = text[i].getText();
79             if (s != null && !s.isEmpty()) {
80                 return false;
81             }
82         }
83
84         return true;
85     }
86
87     /**
88      * Returns the enum associated to a property name
89      * @param propertyName the property name
90      * @return the property enum
91      */
92     public Object getPropertyFromName(int propertyName) {
93         switch (propertyName) {
94             case __GO_FORMATTED_TEXT__ :
95                 return TextObjectProperty.TEXT;
96             case __GO_TEXT_ARRAY_DIMENSIONS__ :
97                 return TextObjectProperty.TEXT_ARRAY_DIMENSIONS;
98             case __GO_TEXT_STRINGS__ :
99                 return FormattedText.FormattedTextProperty.TEXT;
100             case __GO_FONT_STYLE__ :
101                 return Font.FontProperty.STYLE;
102             case __GO_FONT_SIZE__ :
103                 return Font.FontProperty.SIZE;
104             case __GO_FONT_COLOR__ :
105                 return Font.FontProperty.COLOR;
106             case __GO_FONT_FRACTIONAL__ :
107                 return Font.FontProperty.FRACTIONAL;
108             default :
109                 return super.getPropertyFromName(propertyName);
110         }
111     }
112
113     /**
114      * Fast property get method
115      * @param property the property to get
116      * @return the property value
117      */
118     public Object getProperty(Object property) {
119         if (property == TextObjectProperty.TEXT) {
120             return getText();
121         } else if (property == TextObjectProperty.TEXT_ARRAY_DIMENSIONS) {
122             return getTextArrayDimensions();
123         } else if (property == FormattedText.FormattedTextProperty.TEXT) {
124             return getTextStrings();
125         } else if (property == Font.FontProperty.STYLE) {
126             return getFontStyle();
127         } else if (property == Font.FontProperty.SIZE) {
128             return getFontSize();
129         } else if (property == Font.FontProperty.COLOR) {
130             return getFontColor();
131         } else if (property == Font.FontProperty.FRACTIONAL) {
132             return getFontFractional();
133         } else {
134             return super.getProperty(property);
135         }
136     }
137
138     /**
139      * Fast property set method
140      * @param property the property to set
141      * @param value the property value
142      * @return true if the property has been set, false otherwise
143      */
144     public UpdateStatus setProperty(Object property, Object value) {
145         if (property == TextObjectProperty.TEXT) {
146             setText((FormattedText[]) value);
147         } else if (property == TextObjectProperty.TEXT_ARRAY_DIMENSIONS) {
148             setTextArrayDimensions((Integer[]) value);
149         } else if (property == FormattedText.FormattedTextProperty.TEXT) {
150             setTextStrings((String[]) value);
151         } else if (property == Font.FontProperty.STYLE) {
152             setFontStyle((Integer) value);
153         } else if (property == Font.FontProperty.SIZE) {
154             setFontSize((Double) value);
155         } else if (property == Font.FontProperty.COLOR) {
156             setFontColor((Integer) value);
157         } else if (property == Font.FontProperty.FRACTIONAL) {
158             setFontFractional((Boolean) value);
159         } else {
160             return super.setProperty(property, value);
161         }
162
163         return UpdateStatus.Success;
164     }
165
166     /**
167      * @return the text array dimensions
168      */
169     public Integer[] getTextArrayDimensions() {
170         Integer retDimensions[] = new Integer[2];
171         retDimensions[0] = dimensions[0];
172         retDimensions[1] = dimensions[1];
173
174         return retDimensions;
175     }
176
177     /**
178      * Sets the text array dimensions
179      * Recreates an array of formatted text objects.
180      * If there was an existing array, the new array's objects' font properties
181      * are set to those of the existing array's first element, as all the array's objects
182      * are supposed to have the same font properties for now.
183      *
184      * @param dimensions the text array dimensions to set
185      */
186     public void setTextArrayDimensions(Integer[] dimensions) {
187         int currentSize = this.dimensions[0] * this.dimensions[1];
188
189         if (dimensions[0] * dimensions[1] != currentSize) {
190             FormattedText[] newText = new FormattedText[dimensions[0] * dimensions[1]];
191
192             for (int i = 0; i < dimensions[0] * dimensions[1]; i++) {
193                 newText[i] = new FormattedText();
194
195                 if (currentSize >= 1) {
196                     newText[i].setFont(new Font(text[0].getFont()));
197                 }
198             }
199
200             text = newText;
201         }
202
203         this.dimensions[0] = dimensions[0];
204         this.dimensions[1] = dimensions[1];
205     }
206
207     /**
208      * @return the text
209      */
210     public FormattedText[] getText() {
211         FormattedText[] retText = new FormattedText[dimensions[0] * dimensions[1]];
212
213         for (int i = 0; i < dimensions[0] * dimensions[1]; i++) {
214             retText[i] = new FormattedText(text[i]);
215         }
216
217         return retText;
218     }
219
220     /**
221      * @param textArray the textArray to set
222      */
223     public void setText(FormattedText[] textArray) {
224         for (int i = 0; i < dimensions[0] * dimensions[1]; i++) {
225             text[i] = new FormattedText(textArray[i]);
226         }
227     }
228
229     /**
230      * @return the text strings
231      */
232     public String[] getTextStrings() {
233         String[] textStrings = new String[dimensions[0] * dimensions[1]];
234
235         for (int i = 0; i < dimensions[0] * dimensions[1]; i++) {
236             textStrings[i] = new String(text[i].getText());
237         }
238
239         return textStrings;
240     }
241
242     /**
243      * @param textStrings the text strings array to set
244      */
245     public void setTextStrings(String[] textStrings) {
246         for (int i = 0; i < dimensions[0] * dimensions[1]; i++) {
247             text[i].setText(textStrings[i]);
248         }
249     }
250
251     /**
252      * @return the font
253      */
254     public Font getFont() {
255         return text[0].getFont();
256     }
257
258     /**
259      * @param font the font to set
260      */
261     public void setFont(Font font) {
262         for (int i = 0; i < dimensions[0] * dimensions[1]; i++) {
263             text[i].setFont(font);
264         }
265     }
266
267     /**
268      * @return the font style
269      */
270     public Integer getFontStyle() {
271         return text[0].getFont().getStyle();
272     }
273
274     /**
275      * @param style the font style to set
276      */
277     public void setFontStyle(Integer style) {
278         for (int i = 0; i < dimensions[0] * dimensions[1]; i++) {
279             text[i].getFont().setStyle(style);
280         }
281     }
282
283     /**
284      * @return the font color
285      */
286     public Integer getFontColor() {
287         return text[0].getFont().getColor();
288     }
289
290     /**
291      * @param color the font color to set
292      */
293     public void setFontColor(Integer color) {
294         for (int i = 0; i < dimensions[0] * dimensions[1]; i++) {
295             text[i].getFont().setColor(color);
296         }
297     }
298
299     /**
300      * @return the font size
301      */
302     public Double getFontSize() {
303         return text[0].getFont().getSize();
304     }
305
306     /**
307      * @param size the font size to set
308      */
309     public void setFontSize(Double size) {
310         for (int i = 0; i < dimensions[0] * dimensions[1]; i++) {
311             text[i].getFont().setSize(size);
312         }
313     }
314
315     /**
316      * @return the font fractional
317      */
318     public Boolean getFontFractional() {
319         return text[0].getFont().getFractional();
320     }
321
322     /**
323      * @param fractional the font fractional to set
324      */
325     public void setFontFractional(Boolean fractional) {
326         for (int i = 0; i < dimensions[0] * dimensions[1]; i++) {
327             text[i].getFont().setFractional(fractional);
328         }
329     }
330
331 }