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