keep user_data in C
[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-2011 - DIGITEO - Manuel JULIACHS
4  * Copyright (C) 2011 - DIGITEO - Vincent COUVERT
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.graphic_objects.graphicObject;
15
16 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_ARC__;
17 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_AXESMODEL__;
18 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_AXES__;
19 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_AXIS__;
20 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_CALLBACKTYPE__;
21 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_CALLBACK__;
22 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_CHAMP__;
23 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_CHILDREN_COUNT__;
24 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_CHILDREN__;
25 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_COMPOUND__;
26 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_DATATIP__;
27 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_DATA_MODEL__;
28 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_FAC3D__;
29 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_FEC__;
30 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_FIGUREMODEL__;
31 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_FIGURE__;
32 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_GRAYPLOT__;
33 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_HAS_LEGEND_CHILD__;
34 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_HIDDEN__;
35 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_LABEL__;
36 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_LEGEND_CHILD__;
37 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_LEGEND__;
38 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_LIGHT__;
39 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_MATPLOT__;
40 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_PARENT_AXES__;
41 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_PARENT_FIGURE__;
42 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_PARENT__;
43 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_PLOT3D__;
44 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_POLYLINE__;
45 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_PROGRESSIONBAR__;
46 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_RECTANGLE__;
47 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_REFERENCED__;
48 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_SEGS__;
49 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_SELECTED_CHILD__;
50 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_TAG__;
51 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_TEXT__;
52 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_TYPE__;
53 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UICONTEXTMENU__;
54 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UIMENU__;
55 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_CHECKBOX__;
56 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_EDIT__;
57 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FRAME_BORDER__;
58 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FRAME_SCROLLABLE__;
59 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FRAME__;
60 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_IMAGE__;
61 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_LAYER__;
62 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_LISTBOX__;
63 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_POPUPMENU__;
64 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_PUSHBUTTON__;
65 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_RADIOBUTTON__;
66 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_SLIDER__;
67 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_SPINNER__;
68 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_TABLE__;
69 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_TAB__;
70 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_TEXT__;
71 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_VALID__;
72 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_VISIBLE__;
73 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_WAITBAR__;
74
75 import java.util.Arrays;
76 import java.util.LinkedList;
77 import java.util.List;
78
79 import org.scilab.modules.graphic_objects.ObjectRemovedException;
80 import org.scilab.modules.graphic_objects.axes.Axes;
81 import org.scilab.modules.graphic_objects.figure.Figure;
82 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
83 import org.scilab.modules.graphic_objects.legend.Legend;
84
85 /**
86  * GraphicObject class
87  * @author Manuel JULIACHS
88  * @author Vincent COUVERT
89  */
90 public abstract class GraphicObject implements Cloneable {
91
92     public enum UpdateStatus {
93         Success,        // Property updated with new values
94         NoChange,       // Property leave unchanged
95         Fail            // Update Fail
96     };
97
98     /** User data array default size */
99     public static final int USER_DATA_DEFAULT_SIZE = 0;
100
101     /** Graphic objects types */
102     public enum Type { ARC, AXES, AXESMODEL, AXIS, CHAMP, COMPOUND, FAC3D, FEC, FIGURE, FIGUREMODEL, GRAYPLOT,
103                        LABEL, LEGEND, MATPLOT, PLOT3D, POLYLINE, RECTANGLE, SEGS, TEXT, CHECKBOX, EDIT, SPINNER, FRAME,
104                        IMAGE, LISTBOX, POPUPMENU, PUSHBUTTON, RADIOBUTTON, CONSOLE, JAVACONSOLE, SLIDER, TABLE, UITEXT, UIMENU, UIMENUMODEL,
105                        PROGRESSIONBAR, WAITBAR, UICONTEXTMENU, DATATIP, LIGHT, TABGROUP, TAB, LAYER, BORDER, FRAME_SCROLLABLE, UNKNOWNOBJECT
106                      };
107
108     /** GraphicObject properties */
109     public enum GraphicObjectPropertyType { PARENT, CHILDREN, CHILDREN_COUNT, HIDDEN, VISIBLE, TYPE, REFERENCED, VALID, DATA,
110                                             PARENT_FIGURE, PARENT_AXES, HASLEGENDCHILD, LEGENDCHILD, SELECTEDCHILD, TAG, CALLBACK, CALLBACKTYPE, UNKNOWNPROPERTY
111                                           };
112
113     /** Identifier */
114     private Integer identifier;
115
116     /** Parent object is known by its UID */
117     private Integer parent;
118
119     /** Child objects list. Known by their UID */
120     private List <Integer> children;
121
122     /** Specifies whether the object is visible or not */
123     private boolean visible;
124
125     /** Specifies if the "handle" is referenced in scilab */
126     private boolean referenced;
127
128     /** Specifies if the "handle" is valid, i.e included in a rendered object */
129     private boolean valid;
130
131     /** Specifies if the "handle" is hidden, i.e not listed as children in Scilab view */
132     private boolean hidden;
133
134     /** Tag */
135     private String tag;
136
137     /** Callback */
138     private CallBack callback;
139
140     /**
141      * Identifier of the selected child
142      * This was previously implemented as a list, but is used in practice
143      * to store only the identifier of the currently selected child.
144      * To do: use a list if required
145      */
146     private Integer selectedChild;
147
148     /** Constructor */
149     public GraphicObject() {
150         identifier = 0;
151         parent = 0;
152         children = new LinkedList<Integer>();
153         visible = true;
154         valid = true;
155         referenced = false;
156         selectedChild = 0;
157         tag = "";
158         callback = new CallBack("");
159     }
160
161     /**
162      * Clone
163      * @return clone
164      * @see java.lang.Object#clone()
165      */
166     public GraphicObject clone() {
167         GraphicObject copy = null;
168
169         try {
170             copy = (GraphicObject) super.clone();
171         } catch (CloneNotSupportedException e) {
172             // TODO Auto-generated catch block
173             e.printStackTrace();
174         }
175
176         /*
177          * Creating an empty list is done to avoid
178          * still referencing the original object's own list,
179          * which occurs when the Figure model is cloned.
180          */
181         copy.setChildren(new LinkedList<Integer>());
182
183         /*
184          * Avoids keeping the Figure model as a parent
185          * when the Axes model is cloned.
186          */
187         copy.setParent(0);
188
189         /*
190          * Sets no object as the selected child.
191          */
192         copy.setSelectedChild(0);
193
194         return copy;
195     }
196
197     abstract public void accept(Visitor visitor) throws ObjectRemovedException;
198
199     /**
200      * Returns the enum associated to a type name
201      * @param typeName the property name
202      * @return the type enum
203      */
204     public static Type getTypeFromName(int typeName) {
205         switch (typeName) {
206             case __GO_ARC__ :
207                 return Type.ARC;
208             case __GO_AXES__ :
209                 return Type.AXES;
210             case __GO_AXESMODEL__ :
211                 return Type.AXESMODEL;
212             case __GO_AXIS__ :
213                 return Type.AXIS;
214             case __GO_CHAMP__ :
215                 return Type.CHAMP;
216             case __GO_COMPOUND__ :
217                 return Type.COMPOUND;
218             case __GO_FAC3D__ :
219                 return Type.FAC3D;
220             case __GO_FEC__ :
221                 return Type.FEC;
222             case __GO_FIGURE__ :
223                 return Type.FIGURE;
224             case __GO_FIGUREMODEL__ :
225                 return Type.FIGUREMODEL;
226             case __GO_GRAYPLOT__ :
227                 return Type.GRAYPLOT;
228             case __GO_LABEL__ :
229                 return Type.LABEL;
230             case __GO_LEGEND__ :
231                 return Type.LEGEND;
232             case __GO_MATPLOT__ :
233                 return Type.MATPLOT;
234             case __GO_PLOT3D__ :
235                 return Type.PLOT3D;
236             case __GO_POLYLINE__ :
237                 return Type.POLYLINE;
238             case __GO_RECTANGLE__ :
239                 return Type.RECTANGLE;
240             case __GO_SEGS__ :
241                 return Type.SEGS;
242             case __GO_TEXT__ :
243                 return Type.TEXT;
244             case __GO_UI_CHECKBOX__ :
245                 return Type.CHECKBOX;
246             case __GO_UI_EDIT__ :
247                 return Type.EDIT;
248             case __GO_UI_SPINNER__ :
249                 return Type.SPINNER;
250             case __GO_UI_FRAME__ :
251                 return Type.FRAME;
252             case __GO_UI_IMAGE__ :
253                 return Type.IMAGE;
254             case __GO_UI_LISTBOX__ :
255                 return Type.LISTBOX;
256             case __GO_UI_POPUPMENU__ :
257                 return Type.POPUPMENU;
258             case __GO_UI_PUSHBUTTON__ :
259                 return Type.PUSHBUTTON;
260             case __GO_UI_RADIOBUTTON__ :
261                 return Type.RADIOBUTTON;
262             case __GO_UI_SLIDER__ :
263                 return Type.SLIDER;
264             case __GO_UI_TABLE__ :
265                 return Type.TABLE;
266             case __GO_UI_TEXT__ :
267                 return Type.UITEXT;
268             case __GO_UIMENU__ :
269                 return Type.UIMENU;
270             case __GO_UICONTEXTMENU__ :
271                 return Type.UICONTEXTMENU;
272             case __GO_PROGRESSIONBAR__ :
273                 return Type.PROGRESSIONBAR;
274             case __GO_WAITBAR__ :
275                 return Type.WAITBAR;
276             case __GO_DATATIP__:
277                 return Type.DATATIP;
278             case __GO_LIGHT__ :
279                 return Type.LIGHT;
280             case __GO_UI_TAB__ :
281                 return Type.TAB;
282             case __GO_UI_LAYER__ :
283                 return Type.LAYER;
284             case __GO_UI_FRAME_BORDER__ :
285                 return Type.BORDER;
286             case __GO_UI_FRAME_SCROLLABLE__ :
287                 return Type.FRAME_SCROLLABLE;
288             default :
289                 return Type.UNKNOWNOBJECT;
290         }
291     }
292
293     /**
294      * Returns the enum associated to a property name
295      * @param propertyName the property name
296      * @return the property enum
297      */
298     public Object getPropertyFromName(int propertyName) {
299         switch (propertyName) {
300             case __GO_PARENT__ :
301                 return  GraphicObjectPropertyType.PARENT;
302             case __GO_CHILDREN__ :
303                 return GraphicObjectPropertyType.CHILDREN;
304             case __GO_CHILDREN_COUNT__ :
305                 return GraphicObjectPropertyType.CHILDREN_COUNT;
306             case __GO_HIDDEN__ :
307                 return GraphicObjectPropertyType.HIDDEN;
308             case __GO_VISIBLE__ :
309                 return GraphicObjectPropertyType.VISIBLE;
310             case __GO_REFERENCED__ :
311                 return GraphicObjectPropertyType.REFERENCED;
312             case __GO_VALID__ :
313                 return GraphicObjectPropertyType.VALID;
314             case __GO_PARENT_FIGURE__ :
315                 return GraphicObjectPropertyType.PARENT_FIGURE;
316             case __GO_PARENT_AXES__ :
317                 return GraphicObjectPropertyType.PARENT_AXES;
318             case __GO_HAS_LEGEND_CHILD__ :
319                 return GraphicObjectPropertyType.HASLEGENDCHILD;
320             case __GO_LEGEND_CHILD__ :
321                 return GraphicObjectPropertyType.LEGENDCHILD;
322             case __GO_SELECTED_CHILD__ :
323                 return GraphicObjectPropertyType.SELECTEDCHILD;
324             case __GO_TYPE__ :
325                 return GraphicObjectPropertyType.TYPE;
326             case __GO_DATA_MODEL__ :
327                 return GraphicObjectPropertyType.DATA;
328             case __GO_TAG__ :
329                 return GraphicObjectPropertyType.TAG;
330             case __GO_CALLBACK__ :
331                 return GraphicObjectPropertyType.CALLBACK;
332             case __GO_CALLBACKTYPE__ :
333                 return GraphicObjectPropertyType.CALLBACKTYPE;
334             default:
335                 //System.err.println("[ERROR] Unknown Property : "+propertyName+" !!!!!!!!!!");
336                 return GraphicObjectPropertyType.UNKNOWNPROPERTY;
337         }
338     }
339
340     /**
341      * Fast property get method
342      * @param property the property to get
343      * @return the property value
344      */
345     public Object getProperty(Object property) {
346         if (!(property instanceof GraphicObjectPropertyType)) {
347             return null;
348         }
349
350         GraphicObjectPropertyType p = (GraphicObjectPropertyType) property;
351         switch (p) {
352             case PARENT:
353                 return getParent();
354             case CHILDREN:
355                 return getChildren();
356             case CHILDREN_COUNT:
357                 return children.size();
358             case VALID:
359                 return isValid();
360             case HIDDEN:
361                 return isHidden();
362             case VISIBLE:
363                 return getVisible();
364             case PARENT_FIGURE:
365                 return getParentFigure();
366             case PARENT_AXES:
367                 return getParentAxes();
368             case HASLEGENDCHILD:
369                 return getHasLegendChild();
370             case LEGENDCHILD:
371                 return getLegendChild();
372             case SELECTEDCHILD:
373                 return getSelectedChild();
374             case TYPE:
375                 return getType();
376             case DATA:
377                 return getIdentifier();
378             case TAG:
379                 return getTag();
380             case CALLBACK:
381                 return getCallbackString();
382             case CALLBACKTYPE:
383                 return getCallbackType();
384             case UNKNOWNPROPERTY:
385                 return null;
386             default:
387                 return null;
388         }
389     }
390
391     /**
392      * Fast property set method
393      * @param property the property to set
394      * @param value the property value
395      * @return true if the property has been set, false otherwise
396      */
397     public UpdateStatus setProperty(Object property, Object value) {
398         if (!(property instanceof GraphicObjectPropertyType)) {
399             return UpdateStatus.Success;
400         }
401
402         GraphicObjectPropertyType p = (GraphicObjectPropertyType) property;
403         switch (p) {
404             case PARENT:
405                 setParent((Integer) value);
406                 break;
407             case CHILDREN:
408                 setChildren((Integer[]) value);
409                 break;
410             case VALID:
411                 setValid((Boolean) value);
412                 break;
413             case HIDDEN:
414                 setHidden((Boolean) value);
415                 break;
416             case VISIBLE:
417                 setVisible((Boolean) value);
418                 break;
419             case SELECTEDCHILD:
420                 setSelectedChild((Integer) value);
421                 break;
422             case DATA:
423                 return UpdateStatus.Success;
424             case TAG:
425                 setTag((String) value);
426                 break;
427             case CALLBACK:
428                 setCallbackString((String) value);
429                 break;
430             case CALLBACKTYPE:
431                 setCallbackType((Integer) value);
432                 break;
433             case UNKNOWNPROPERTY:
434                 return UpdateStatus.Fail;
435             default:
436                 return UpdateStatus.Success;
437         }
438
439         return UpdateStatus.Success;
440     }
441
442     /**
443      * Returns a null property
444      * @param property property name
445      * @return null property
446      */
447     public Object getNullProperty(String property) {
448         return null;
449     }
450
451     /**
452      * Void property get method
453      * @param property the property name
454      */
455     public Object getPropertyVoid(String property) {
456         // TODO
457         return null;
458     }
459
460     /* TODO */
461     /**
462      * Void property set method
463      * @param property the property name
464      * @param value the property value
465      */
466     public void setPropertyVoid(String property, Object value) {
467         // TODO
468     }
469
470     /**
471      * @return the children
472      */
473     public Integer[] getChildren() {
474         return children.toArray(new Integer[children.size()]);
475     }
476
477     /**
478      * Adds a child.
479      * @param child the identifier of the added child.
480      */
481     public void addChild(Integer child) {
482         children.add(0, child);
483     }
484
485     /**
486      * Removes a child.
487      * @param child the identifier of the removed child.
488      */
489     public void removeChild(Integer child) {
490         children.remove(child);
491     }
492
493     /**
494      * @param children the children to set
495      */
496     private UpdateStatus setChildren(List<Integer> children) {
497         this.children = children;
498         return UpdateStatus.Success;
499     }
500
501     /**
502      * @param children the children to set
503      */
504     public UpdateStatus setChildren(Integer[] children) {
505         this.children = new LinkedList<Integer>(Arrays.asList(children));
506         return UpdateStatus.Success;
507     }
508
509     /**
510      * @return the identifier
511      */
512     public Integer getIdentifier() {
513         return identifier;
514     }
515
516     /**
517      * @param identifier the identifier to set
518      */
519     public UpdateStatus setIdentifier(Integer identifier) {
520         this.identifier = identifier;
521         return UpdateStatus.Success;
522     }
523
524     /**
525      * @return the parent
526      */
527     public Integer getParent() {
528         return parent;
529     }
530
531     /**
532      * @param parent the parent to set
533      * @return TODO
534      */
535     public UpdateStatus setParent(Integer parent) {
536         this.parent = parent;
537         return UpdateStatus.Success;
538     }
539
540     /**
541      * @return the tag
542      */
543     public String getTag() {
544         return tag;
545     }
546
547     /**
548      * @param tag the tag to set
549      * @return TODO
550      */
551     public UpdateStatus setTag(String tag) {
552         if (this.tag.equals(tag)) {
553             return UpdateStatus.NoChange;
554         }
555
556         this.tag = tag;
557         return UpdateStatus.Success;
558     }
559
560     /**
561      * @return the callback
562      */
563     public String getCallbackString() {
564         return callback.getCommand();
565     }
566
567     /**
568      * @param callback the callback to set
569      * @return TODO
570      */
571     public UpdateStatus setCallbackString(String callback) {
572         return this.callback.setCommand(callback);
573     }
574
575     /**
576      * @return the callbackType
577      */
578     public Integer getCallbackType() {
579         return callback.getCommandType();
580     }
581
582     /**
583      * @param callbackType the callbackType to set
584      * @return TODO
585      */
586     public UpdateStatus setCallbackType(Integer callbackType) {
587         this.callback.setCommandType(callbackType);
588         return UpdateStatus.Success;
589     }
590
591     /**
592      * Get parent Figure method
593      * Returns the identifier of the object's parent Figure
594      * If the object is a Figure, then returns its own identifier.
595      * To be done: use a member variable storing the up-to-date current parent Figure,
596      * returned instead of recursively ascending the hierarchy at each call.
597      * @return the parent Figure identifier
598      */
599     public Integer getParentFigure() {
600         if (this instanceof Figure) {
601             return getIdentifier();
602         }
603
604         if (getParent() != 0 && GraphicController.getController().getObjectFromId(getParent()) != null) {
605             return GraphicController.getController().getObjectFromId(getParent()).getParentFigure();
606         }
607
608         /* No parent Figure found */
609         return 0;
610     }
611
612     /**
613      * Get parent Axes method
614      * Returns the identifier of the object's parent Axes
615      * If the object is an Axes, then returns its own identifier.
616      * To be done: use a member variable storing the up-to-date current parent Axes,
617      * returned instead of recursively ascending the hierarchy at each call.
618      * @return the parent Axes identifier
619      */
620     public Integer getParentAxes() {
621         if (this instanceof Axes) {
622             return getIdentifier();
623         } else {
624             if (getParent() != 0 && GraphicController.getController().getObjectFromId(getParent()) != null) {
625                 return GraphicController.getController().getObjectFromId(getParent()).getParentAxes();
626             } else {
627                 /* No parent Axes found */
628                 return 0;
629             }
630         }
631     }
632
633     /**
634      * Get has legend child method
635      * Returns a boolean indicating whether one of the object's direct children
636      * is a Legend object. Only one Legend is supposed to be present in the list.
637      * To be done: storing the property and updating it only when a Legend object
638      * is inserted or deleted instead of searching the children list when the
639      * property is queried.
640      * @return a Boolean indicating whether the object has a child Legend object or not
641      */
642     public Boolean getHasLegendChild() {
643         for (int i = 0; i < children.size(); i++) {
644             GraphicObject currentObject = GraphicController.getController().getObjectFromId(children.get(i));
645
646             if (currentObject instanceof Legend) {
647                 return true;
648             }
649         }
650
651         return false;
652     }
653
654     /**
655      * Returns the identifier of the object's direct child that is a Legend object.
656      * It returns an empty string if the object has no Legend in its children list
657      * (one Legend is supposed to be present at most).
658      * @return the object's child Legend object identifier, or an empty string if no child Legend found.
659      */
660     public Integer getLegendChild() {
661         for (int i = 0; i < children.size(); i++) {
662             GraphicObject currentObject = GraphicController.getController().getObjectFromId(children.get(i));
663
664             if (currentObject instanceof Legend) {
665                 return currentObject.getIdentifier();
666             }
667         }
668
669         /* No child legend found */
670         return 0;
671     }
672
673     /**
674      * Get selected child method
675      * @return the selected child
676      */
677     public Integer getSelectedChild() {
678         return selectedChild;
679     }
680
681     /**
682      * Set selected child method
683      * @param selectedChild the selected child to set
684      */
685     public UpdateStatus setSelectedChild(Integer selectedChild) {
686         this.selectedChild = selectedChild;
687         return UpdateStatus.Success;
688     }
689
690     /**
691      * Get visible method
692      * @return the visible
693      */
694     public Boolean getVisible() {
695         return visible;
696     }
697
698     /**
699      * Set visible method
700      * @param visible the visible to set
701      * @return TODO
702      */
703     public UpdateStatus setVisible(Boolean visible) {
704         if (this.visible == visible) {
705             return UpdateStatus.NoChange;
706         }
707
708         this.visible = visible;
709         return UpdateStatus.Success;
710     }
711
712     /**
713      * Each type should name itself
714      * @return Type as String
715      */
716     public abstract Integer getType();
717
718     /**
719      * isValid method
720      * @return valid
721      */
722     public Boolean isValid() {
723         return valid;
724     }
725
726     /**
727      * Set hidden method
728      * @param hidden the value to set
729      * @return TODO
730      */
731     public UpdateStatus setHidden(Boolean hidden) {
732         this.hidden = hidden;
733         return UpdateStatus.Success;
734     }
735
736     /**
737      * isHidden method
738      * @return hidden
739      */
740     public Boolean isHidden() {
741         return hidden;
742     }
743
744     /**
745      * Set valid method
746      * @param valid the validity to set
747      * @return TODO
748      */
749     public UpdateStatus setValid(Boolean valid) {
750         this.valid = valid;
751         return UpdateStatus.Success;
752     }
753
754     /**
755      * isReferenced method
756      * @return referenced
757      */
758     public Boolean isReferenced() {
759         return referenced;
760     }
761
762     /**
763      * Set referenced method
764      * @param referenced the reference status to set
765      * @return TODO
766      */
767     public UpdateStatus setReferenced(Boolean referenced) {
768         this.referenced = referenced;
769         return UpdateStatus.Success;
770     }
771 }