Use SciRenderer (http://forge.scilab.org/index.php/p/scirenderer/) for the new Scilab...
[scilab.git] / scilab / modules / graphic_objects / src / java / org / scilab / modules / graphic_objects / graphicObject / GraphicObject.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - 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.graphicObject;
14
15 import java.util.ArrayList;
16 import java.util.List;
17
18 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.*;
19
20 /**
21  * GraphicObject class
22  * @author Manuel JULIACHS
23  */
24 public abstract class GraphicObject implements Cloneable {
25         /** User data array default size */
26         public static final int USER_DATA_DEFAULT_SIZE = 0;
27
28         /** Graphic objects types */
29         public enum Type { ARC, AXES, AXIS, CHAMP, COMPOUND, FAC3D, FEC, FIGURE, GRAYPLOT,
30                 LABEL, LEGEND, MATPLOT, PLOT3D, POLYLINE, RECTANGLE, SEGS, TEXT, UNKNOWNOBJECT };
31         
32         /** GraphicObject properties */
33         public enum GraphicObjectPropertyType { PARENT, CHILDREN, CHILDREN_COUNT, VISIBLE, USERDATA, USERDATASIZE, TYPE, REFERENCED, VALID, DATA, UNKNOWNPROPERTY };
34
35         /** Identifier */
36         private String identifier;
37         
38         /** Parent object is known by its UID */
39         private String parent;
40
41         /** Child objects list. Known by their UID */
42         private List <String> children;
43
44         /** Specifies whether the object is visible or not */
45         private boolean visible;
46
47         /** Specifies if the "handle" is referenced in scilab */
48         private boolean referenced;
49         
50         /** Specifies if the "handle" is valid, i.e included in a rendered object */
51         private boolean valid;
52         
53         /** User data */
54         private Object userData;
55
56         /** Constructor */
57         public GraphicObject() {
58                 identifier = null;
59                 parent = "";
60                 children = new ArrayList<String>(0);
61                 visible = true;
62                 userData = null;
63                 valid = true;
64                 referenced = false;
65         }
66
67         public GraphicObject clone() {
68             GraphicObject copy = null;
69         try {
70             copy = (GraphicObject) super.clone();
71         } catch (CloneNotSupportedException e) {
72             // TODO Auto-generated catch block
73             e.printStackTrace();
74         }
75
76             /*
77              * Creating an empty list is done to avoid
78              * still referencing the original object's own list,
79              * which occurs when the Figure model is cloned.
80              */
81             copy.setChildren(new ArrayList<String>(0));
82
83             /*
84              * Avoids keeping the Figure model as a parent
85              * when the Axes model is cloned.
86              */
87             copy.setParent("");
88
89             return (GraphicObject) copy;
90         }
91
92     abstract public void accept(IVisitor visitor);
93         
94         /**
95      * Returns the enum associated to a type name
96      * @param typeName the property name
97      * @return the type enum
98      */
99     public static Type getTypeFromName(String typeName) {
100         if (typeName.equals(__GO_ARC__)) {
101             return Type.ARC;
102         } else if (typeName.equals(__GO_AXES__)) {
103             return Type.AXES;
104         } else if (typeName.equals(__GO_AXIS__)) {
105             return Type.AXIS;
106         } else if (typeName.equals(__GO_CHAMP__)) {
107             return Type.CHAMP;
108         } else if (typeName.equals(__GO_COMPOUND__)) {
109             return Type.COMPOUND;
110         } else if (typeName.equals(__GO_FAC3D__)) {
111             return Type.FAC3D;
112         } else if (typeName.equals(__GO_FEC__)) {
113             return Type.FEC;
114         } else if (typeName.equals(__GO_FIGURE__)) {
115             return Type.FIGURE;
116         } else if (typeName.equals(__GO_GRAYPLOT__)) {
117             return Type.GRAYPLOT;
118         } else if (typeName.equals(__GO_LABEL__)) {
119             return Type.LABEL;
120         } else if (typeName.equals(__GO_LEGEND__)) {
121             return Type.LEGEND;
122         } else if (typeName.equals(__GO_MATPLOT__)) {
123             return Type.MATPLOT;
124         } else if (typeName.equals(__GO_PLOT3D__)) {
125             return Type.PLOT3D;
126         } else if (typeName.equals(__GO_POLYLINE__)) {
127             return Type.POLYLINE;
128         } else if (typeName.equals(__GO_RECTANGLE__)) {
129             return Type.RECTANGLE;
130         } else if (typeName.equals(__GO_SEGS__)) {
131             return Type.SEGS;
132         } else if (typeName.equals(__GO_TEXT__)) {
133             return Type.TEXT;
134         } else {
135             return Type.UNKNOWNOBJECT;
136         }
137         }
138
139         /**
140          * Returns the enum associated to a property name
141          * @param propertyName the property name
142          * @return the property enum
143          */
144         public Object getPropertyFromName(String propertyName) {
145                 if (propertyName.equals(__GO_PARENT__)) {
146                         return  GraphicObjectPropertyType.PARENT;
147                 } else if (propertyName.equals(__GO_CHILDREN__)) {
148                         return GraphicObjectPropertyType.CHILDREN;
149                 } else if (propertyName.equals(__GO_CHILDREN_COUNT__)) {
150                         return GraphicObjectPropertyType.CHILDREN_COUNT;
151                 } else if (propertyName.equals(__GO_VISIBLE__)) {
152                         return GraphicObjectPropertyType.VISIBLE;
153                 } else if (propertyName.equals(__GO_USER_DATA__)) {
154                         return GraphicObjectPropertyType.USERDATA;
155                 } else if (propertyName.equals(__GO_USER_DATA_SIZE__)) {
156                         return GraphicObjectPropertyType.USERDATASIZE;
157                 } else if (propertyName.equals(__GO_REFERENCED__)) {
158                         return GraphicObjectPropertyType.REFERENCED;
159                 } else if (propertyName.equals(__GO_VALID__)) {
160                         return GraphicObjectPropertyType.VALID;
161                 } else if (propertyName.equals(__GO_TYPE__)) {
162                         return GraphicObjectPropertyType.TYPE;
163                 }  else if (propertyName.equals(__GO_DATA_MODEL__)) {
164                         return GraphicObjectPropertyType.DATA;
165                 }  else {
166                         return GraphicObjectPropertyType.UNKNOWNPROPERTY;
167                 }
168         }
169
170         /**
171          * Fast property get method
172          * @param property the property to get
173          * @return the property value
174          */
175         public Object getProperty(Object property) {
176                 if (property == GraphicObjectPropertyType.PARENT) {
177                         return getParent();
178                 } else if (property == GraphicObjectPropertyType.CHILDREN) {
179                         return getChildren();
180                 } else if (property == GraphicObjectPropertyType.CHILDREN_COUNT) {
181                         return getChildren().length;
182                 } else if (property == GraphicObjectPropertyType.VISIBLE) {
183                         return getVisible();
184                 } else if (property == GraphicObjectPropertyType.USERDATA) {
185                         return getUserData();
186                 } else if (property == GraphicObjectPropertyType.USERDATASIZE) {
187                         return getUserDataSize();
188                 } else if (property == GraphicObjectPropertyType.TYPE) {
189             return getType();
190         }  else if (property == GraphicObjectPropertyType.DATA) {
191                         return getIdentifier();
192         }  else if (property == GraphicObjectPropertyType.UNKNOWNPROPERTY) {
193                         return null;
194                 } else {
195                         return null;
196                 }
197         }
198
199         /**
200          * Fast property set method
201          * @param property the property to set
202          * @param value the property value
203          * @return true if the property has been set, false otherwise
204          */
205         public boolean setProperty(Object property, Object value) {
206                 if (property == GraphicObjectPropertyType.PARENT) {
207                         setParent((String) value);
208                 } else if (property == GraphicObjectPropertyType.CHILDREN) {
209                         setChildren((List<String>) value);
210                 } else if (property == GraphicObjectPropertyType.VISIBLE) {
211                         setVisible((Boolean) value);
212                 } else if (property == GraphicObjectPropertyType.USERDATA) {
213                         setUserData(value);
214                 } else if (property == GraphicObjectPropertyType.USERDATASIZE) {
215                         return false;
216         } else if (property == GraphicObjectPropertyType.DATA) {
217                         return true;
218                 } else if (property == GraphicObjectPropertyType.UNKNOWNPROPERTY) {
219                         return false;
220                 }
221
222                 return true;
223         }
224
225         /**
226          * Returns a null property
227          * @param property property name
228          * @return null property
229          */
230         public Object getNullProperty(String property) {
231                 return null;
232         }
233
234         /**
235          * Void property get method
236          * @param property the property name
237          */
238         public Object getPropertyVoid(String property) {
239                 // TBD
240                 return null;
241         }
242
243         /* TBD */
244         /**
245          * Void property set method
246          * @param property the property name
247          * @param value the property value
248          */
249         public void setPropertyVoid(String property, Object value) {
250                 // TBD
251         }
252         
253         /**
254          * @return the children
255          */
256         public String[] getChildren() {
257                 String[] result = new String[children.size()];
258             
259                 for (int i = 0 ; i < children.size() ; ++i) {
260                 result[i] = children.get(i);
261             }
262                 
263                 return result;
264         }
265
266         /**
267          * @param children the children to set
268          */
269         public void setChildren(List<String> children) {
270                 this.children = children;
271         }
272
273         /**
274          * @return the identifier
275          */
276         public String getIdentifier() {
277                 return identifier;
278         }
279
280         /**
281          * @param identifier the identifier to set
282          */
283         public void setIdentifier(String identifier) {
284                 this.identifier = identifier;
285         }
286
287         /**
288          * @return the parent
289          */
290         public String getParent() {
291                 return parent;
292         }
293
294         /**
295          * @param parent the parent to set
296          */
297         public void setParent(String parent) {
298                 this.parent = parent;
299         }
300
301         /**
302          * @return the userData
303          */
304         public Object getUserData() {
305                 return userData;
306         }
307
308         /**
309          * @param userData the userData to set
310          */
311         public void setUserData(Object userData) {
312             this.userData = userData;
313         }
314
315         /**
316          * @return the userDataSize
317          */
318         public Integer getUserDataSize() {
319                 return 0;
320         }
321
322         /**
323          * Get visible method
324          * @return the visible
325          */
326         public Boolean getVisible() {
327                 return visible;
328         }
329
330         /**
331          * Set visible method
332          * @param visible the visible to set
333          */
334         public void setVisible(Boolean visible) {
335                 this.visible = visible;
336         }
337         
338         /**
339          * Each type should name itself
340          * @return Type as String
341          */
342         // TODO : Should be public abstract.
343         //public abstract String getType();
344         public String getType() {
345             return "???";
346         }
347         
348     /**
349      * isValid method
350      * @return valid
351      */
352     public Boolean isValid() {
353         return valid;
354     }
355
356     /**
357      * Set valid method
358      * @param valid the validity to set
359      */
360     public void setValid(Boolean valid) {
361         this.valid = valid;
362     }
363     
364     /**
365      * isReferenced method
366      * @return referenced 
367      */
368     public Boolean isReferenced() {
369         return referenced;
370     }
371
372     /**
373      * Set referenced method
374      * @param referenced the reference status to set
375      */
376     public void setReferenced(Boolean referenced) {
377         this.referenced = referenced;
378     }
379 }