home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / VCAFE.3.0A / Main.bin / VisualObject.java < prev    next >
Text File  |  1998-10-25  |  23KB  |  569 lines

  1. /*
  2.  * Copyright 1998 Symantec Corporation, All Rights Reserved.
  3.  */
  4.  
  5. package com.symantec.itools.vcafe.openapi;
  6.  
  7. import java.io.File;
  8. import java.util.Enumeration;
  9. import java.awt.Image;
  10. import java.awt.datatransfer.Transferable;
  11. import com.symantec.itools.vcafe.openapi.datatransfer.TransferableVisualObjects;
  12. import com.symantec.itools.vcafe.openapi.dtreflect.DTClass;
  13.  
  14. /**
  15.  * The API used to represent and access an object that can be visually manipulated in the Visual
  16.  * Cafe environment.  Examples of this include java objects (classes, Components), and non-java
  17.  * objects (folders, project templates, etc).
  18.  *
  19.  * Each <code>VisualObject</code> has a set of <code>VisualProperties</code>.
  20.  *
  21.  * A plug-in can obtain a list, or library, of these objects from a <code>VisualProject</code> by using the
  22.  * <code>getObjectLibrary</code> method.  A plug-in can use the methods in the <code>VisualObject</code> class to update
  23.  * properties and other attribues.
  24.  *
  25.  * The implementation of all of <code>VisualObject</code>'s abstract methods first calls
  26.  * checkValidity().  Any method could therefore throw an <code>InvalidVisualObjectException</code>.
  27.  * This exception extends <code>RuntimeException</code>, so doesn't have to be explicity declared or
  28.  * caught.  A <code>VisualObject</code> can become invalid if it is removed from its project, or its
  29.  * project is closed, and the corresponding <code>VisualObjectListener</code> message is ignored, for example.
  30.  *
  31.  * @see    VisualProject#getObjectLibrary
  32.  * @see    VisualCafe#getComponentLibrary
  33.  * @see    VisualRepository
  34.  * @see InvalidVisualObjectException
  35.  *
  36.  * @author Symantec Internet Tools Division
  37.  * @version 1.0
  38.  * @since VCafe 3.0
  39.  */
  40.  
  41. public abstract class VisualObject implements Cloneable {
  42.  
  43.     /**
  44.      * Flag indicating this object is "invisible".  An invisble object is one that doesn't paint
  45.      * to the screen at runtime.
  46.      * @see #isInvisible
  47.      */
  48.     public static final int VPO_INVISIBLE                = (1<<0);
  49.     public static final int VPO_STARTER                    = (1<<1);
  50.     public static final int VPO_IS_DEFAULT                = (1<<2);
  51.     /**
  52.      * Flag indicating this object is a "root obejct".  A root object appears at the top level in
  53.      * project windows and has associated java source code.
  54.      * @see #isRootObject
  55.      */
  56.     public static final int VPO_ROOT_OBJECT                = (1<<3);
  57.     public static final int VPO_NO_NAME                    = (1<<4);
  58.     public static final int VPO_PARSER_ONLY                = (1<<5);
  59.     public static final int VPO_DESIGN_TIME_ONLY        = (1<<6);
  60.     public static final int VPO_ADDED                    = (1<<7);
  61.     public static final int VPO_CONTAINER_ONLY            = (1<<8);
  62.     public static final int VPO_USER_OBJECT                = (1<<9);
  63.     public static final int VPO_IS_ARRAY                = (1<<10);
  64.     /**
  65.      * Flag indicating this object is a project template or folder.
  66.      * @see VisualCafe#getProjectTemplates
  67.      */
  68.     public static final int VPO_PROJ_TEMPL_FOLDER        = (1<<11);
  69.     public static final int VPO_ERROR                    = (1<<12);
  70.     /**
  71.      * Flag indicating this object is displayed on the toolbar.
  72.      */
  73.     public static final int VPO_ADDED_TO_TOOLBAR        = (1<<13);
  74.     public static final int VPO_CUSTOMIZER_HIDDENSTATE    = (1<<14);
  75.     /**
  76.      * Flag indicating this object is serializable
  77.      */
  78.     public static final int VPO_SERIALIZABLE            = (1<<15);
  79.     public static final int VPO_NOINITDECLCONNTROLS        = (1<<16);
  80.     public static final int VPO_CUSTOM_VIEW                = (1<<17);
  81.  
  82.  
  83.     /**
  84.      * Gets the instance name of this object, e.g., "checkbox1".
  85.      *
  86.      * @return        the instance name.
  87.      */
  88.     public abstract String getName();
  89.  
  90.     /**
  91.      * Gets the package name of this object, e.g., "java.awt".
  92.      *
  93.      * @return        the package name.
  94.      */
  95.     public abstract String getPackageName();
  96.  
  97.     /**
  98.      * Gets the description of this object.
  99.      *
  100.      * @return      the description of the visual object.
  101.      */
  102.     public abstract String getDescription();
  103.  
  104.     /**
  105.      * Obtains the flags of this object.
  106.      *
  107.      * @return        an integer which combines all this object's flags.
  108.      */
  109.     public abstract int getFlags();
  110.  
  111.  
  112.     /**
  113.      * Gets this <code>VisualObject</code>'s unique numeric ID within its <code>VisualRepository</code>.
  114.      * The ID can be zero if the the object is not in a <code>VisualRepository</code>.  This can
  115.      * be the case if a new <code>VisualObject</code> has just been created an not yet inserted.
  116.      * @return a unique numeric ID within its <code>VisualRepository</code>, or zero.
  117.      */
  118.     public abstract int getObjectID();
  119.  
  120.     /**
  121.      * Gets the full java class name of this object, e.g. returns "java.awt.Checkbox".
  122.      * @return this object's full java class name.
  123.      */
  124.     public abstract String getClassName();
  125.  
  126.     /**
  127.      * Gets the short java class name of this object, e.g. returns "Checkbox".
  128.      * @return this object's short java class name.
  129.      */
  130.     public abstract String getShortClassName();
  131.  
  132.     /**
  133.      * Gets the default name of this object.
  134.      * Usually the same as <code>getShortClassName()</code>, but some components describe two
  135.      * types of objects.
  136.      * For example, <code>java.awt.Checkbox</code> can return either "Checkbox" or "RadioButton".
  137.      * @return this object's default name.
  138.      */
  139.     public abstract String getDefaultName();
  140.  
  141.     /**
  142.      * Gets the java class name of this object's superclass.
  143.      * @return this object's superclass's name.
  144.      */
  145.     public abstract String getSuperClassName();
  146.  
  147.     /**
  148.      * Determineswhether this object is an instance of the given class.
  149.      * @param className a full class name
  150.      * @return <code>true</code> if this object is an instance of <code>className</code>, <code>false</code> otherwise.
  151.      */
  152.     public abstract boolean isInstanceOf(String className);
  153.  
  154.     /**
  155.      * Determines whether this object represents a java object (as opposed to a folder,
  156.      * project template, etc).
  157.      * @return <code>true</code> if so, <code>false</code> otherwise.
  158.      */
  159.     public abstract boolean isJavaObject();
  160.  
  161.     /**
  162.      * Determines whether this object is "invisible", i.e., should be ignored.
  163.      * An invisible object is one that doesn't paint to the screen at runtime.
  164.      * Invisible objects sometimes appear in the component library.
  165.      * @return <code>true</code> if so, <code>false</code> otherwise.
  166.      */
  167.     public boolean isInvisible() {
  168.         return (getFlags() & VPO_INVISIBLE) != 0;
  169.     }
  170.  
  171.     /**
  172.      * Determines whether this object is a "root object".
  173.      * A root object appears at the top level in project windows and has associated java source code.
  174.      * 
  175.      * @return <code>true</code> if so, <code>false</code> otherwise.
  176.      */
  177.     public boolean isRootObject() {
  178.         return (getFlags() & VPO_ROOT_OBJECT) != 0;
  179.     }
  180.  
  181.     /**
  182.      * Gets the first child (component) of the object.
  183.      * <p>
  184.      * To traverse a visual object hierarchy downwards, use
  185.      * <code>getFirstChild()</code> followed by <code>getSibling()</code>, recursively.
  186.      *
  187.      * @see #getSibling
  188.      * @return the first child object or <code>null</code> if no children.
  189.      */
  190.     public abstract VisualObject getFirstChild();
  191.  
  192.     /**
  193.      * Gets the parent (container) of the object.
  194.      * <p>
  195.      * To traverse a visual object heirarchy upwards, use
  196.      * <code>getParent()</code> recursively until <code>isRootObject()</code> is <code>true</code>.
  197.      * <p>
  198.      * The parent of a root object has no visual significance.
  199.      *
  200.      * @return parent of this visual object or <code>null</code> if no parent.
  201.      */
  202.     public abstract VisualObject getParent();
  203.  
  204.     /**
  205.      * Gets this object's next sibling.
  206.      * Siblings have the same parent object.
  207.      *
  208.      * @return the next sibling of this visual object or <code>null</code> if none.
  209.      */
  210.     public abstract VisualObject getSibling();
  211.  
  212.     /**
  213.      * Gets the child object with matching name, searching recursively.
  214.      * @param name the name of the child to find.
  215.      * @return the child, or <code>null</code> if none.
  216.      */
  217.     public abstract VisualObject findChildByName(String name);
  218.  
  219.     /**
  220.      * Gets this object's root object.
  221.      * The returned object is either this object itself or the first of its parents for which
  222.      * <code>isRootObject()</code> returns <code>true</code>.
  223.      * @return the root object, or <code>null</code> if none is found.
  224.      */
  225.     public abstract VisualObject getRootObject();
  226.  
  227.     /**
  228.      * Detemines whether this object is the same as or a parent of the given object.
  229.      * @param object the given object.
  230.      * @return <code>true</code> if the object is the same as the argument
  231.      * object or one of its parents, <code>false</code> otherwise.
  232.      */
  233.     public abstract boolean isSameOrChild(VisualObject object);
  234.  
  235.     /**
  236.      * Deletes this visual object.
  237.      * <p>
  238.      * This visual object is delinked from the parent/child/sibling hierarchy,
  239.      * removed from its project and discarded.
  240.      */
  241.     public abstract void delete();
  242.  
  243.     /**
  244.      * An <code>insert</code> "insertionOperation" value indicating the object will be moved from its
  245.      * current location and inserted in the new location.
  246.      * @see #insert
  247.      */
  248.     public static final int MOVE_OBJECT_OPERATION = 0;
  249.     /**
  250.      * An <code>insert</code> "insertionOperation" value indicating a copy of the object will inserted.
  251.      * @see #insert
  252.      */
  253.     public static final int COPY_OBJECT_OPERATION = 1;
  254.     /**
  255.      * An <code>insert</code> "before" value indicating a copy of the object will be appended at the end
  256.      * of the parent object's list of children.
  257.      * @see #insert
  258.      */
  259.     public static final VisualObject INSERT_AT_END = null;
  260.  
  261.     /**
  262.      * Inserts the object as a child of this visual object
  263.      * and before the specified visual object.
  264.      *
  265.      * @param    object    object to be inserted.
  266.      * @param    before    object that will follow inserted object in sibling list.
  267.      *                    if <code>INSERT_AD_END</code>, the object is inserted at the end.
  268.      * @param    insertOperation    <code>MOVE_OBJECT_OPERATION</code> - to move the object from its current location
  269.      * and insert it at the new location, or <code>COPY_OBJECT_OPERATION</code> - to insert a copy of the object 
  270.      * at the new location.
  271.      * @return <code>true</code> if the object was successfully moved/copied, <code>false</code> if the operation failed.
  272.      * @see #canInsert
  273.      */
  274.     public abstract boolean insert(VisualObject object, VisualObject before, int insertOperation);
  275.  
  276.     /**
  277.      * Determines whether an object can be inserted as a component of this object.
  278.      *
  279.      * @param    object    object to be tested.
  280.      * @return <code>true</code> if this object can contain argument object, <code>false</code> otherwise.
  281.      * @see #insert
  282.      */
  283.     public abstract boolean canInsert(VisualObject object);
  284.  
  285.     /**
  286.      * Gets the name of this object's customizer class.
  287.      * A customizer provides the GUI used to customize this <code>VisualObject</code>.  It is a type
  288.      * of Component.
  289.      * @return the name of this object's customizer class.
  290.      */
  291.     public abstract String getCustomizerClassName();
  292.  
  293.     /**
  294.      * Gets the name of the JAR file containing the code for this bean.
  295.      * @return the JAR filename.
  296.      */
  297.     public abstract String getJarName();
  298.  
  299.     /**
  300.      * Gets the JAR file containing the code for this bean.
  301.      * @return the JAR file.
  302.      */
  303.     public abstract File getJarFile();
  304.  
  305.     /**
  306.      * Gets the <code>VisualProject</code> that this <code>VisualObject</code> belongs to.
  307.      * @return the <code>VisualProject</code> that contains this object, or <code>null</code> if this object is in the
  308.      * Component Library.
  309.      */
  310.     public abstract VisualProject getVisualProject();
  311.  
  312.     /**
  313.      * Gets the <code>VisualRepository</code> that contains this object.
  314.      * This can be a project's Object Library, the Component
  315.      * Library, or <code>null</code> if the object hasn't been inserted.
  316.      * @return a <code>VisualRepository</code> identifying the Component Library, a <code>VisualProject</code>'s
  317.      * Object Library, or <code>null</code>.
  318.      */
  319.     public abstract VisualRepository getVisualRepository();
  320.  
  321.     /**
  322.      * Gets the id of the <code>ProjectFile</code> that contains this <code>VisualObject</code>.
  323.      * @return the id of <code>ProjectFile</code> that contains this object, or <code>-1</code> if
  324.      * this object is in the Component Library.
  325.      */
  326.     public abstract int getProjectFileID();
  327.  
  328.     /**
  329.      * Gets the <code>ProjectFile</code> that contains this <code>VisualObject</code>.
  330.      * @return the <code>ProjectFile</code> that contains this object, or <code>null</code> if
  331.      * this object is in the Component Library.
  332.      */
  333.     public abstract ProjectFile getProjectFile();
  334.  
  335.     /**
  336.      * Gets a <code>VisualProperty</code> given its internal name.
  337.      * Internal names typically begin with "ipn". For example, the internal property name for 
  338.      * <code>JMenuItem.text</code> is "ipntext".
  339.      *
  340.      * @param    internalPropertyName    the locale-independent property name.
  341.      * @return the <code>VisualProperty</code> or <code>null</code> if there is no property with that name.
  342.      */
  343.     public abstract VisualProperty findProperty(String internalPropertyName);
  344.  
  345.     /**
  346.      * Gets this object's the first visible <code>VisualProperty</code>.
  347.      * @return the first visible <code>VisualProperty</code>, or <code>null</code> if none.
  348.      * @see     VisualProperty#getSibling
  349.      * @see     VisualProperty#getFirstChild
  350.      */
  351.     public abstract VisualProperty getFirstProperty();
  352.  
  353.     /**
  354.      * Gets this object's default <code>VisualProperty</code>.
  355.      *
  356.      * This is the property that will be selected in the property list by default.
  357.      * @return the <code>VisualProperty</code>, or <code>null</code> if none.
  358.      */
  359.     public abstract VisualProperty getDefaultProperty();
  360.  
  361.  
  362.     /**
  363.      * Determines the number of <code>VisualProperties</code> this <code>VisualObject</code> has.
  364.      * @return      the number of <code>VisualProperties</code>, or 0 if this <code>VisualObject</code> has no properties.
  365.      * @see #getProperty
  366.      * @see #getProperties
  367.      */
  368.     public abstract int getNumProperties();
  369.  
  370.     /**
  371.      * Gets the <code>VisualProperty</code> with the specified zero-based index.
  372.      * @param    index the specified zero-based index.
  373.      * @return    the specified <code>VisualProperty</code> object.
  374.      * @throws    <code>ArrayIndexOutOfBoundsException</code> if the index is out of range.
  375.      * @see #getProperties
  376.      * @see #getNumProperties
  377.      */
  378.     public abstract VisualProperty getProperty(int index);
  379.  
  380.     /**
  381.      * Gets all of the <code>VisualProperties</code> of this object. If none exist then a zero-length array is returned.
  382.      *
  383.      * @return      an array of <code>VisualProperty</code> objects.
  384.      * @see #getProperty
  385.      * @see #getNumProperties
  386.      */
  387.     public abstract VisualProperty[] getProperties();
  388.  
  389.     /**
  390.      * Enumerates the top level, visible <code>VisualProperties</code>.  The <code>Enumeration</code> elements are
  391.      * <code>VisualProperty</code> objects.  An <code>Enumeration</code> is returned even if this <code>VisualObject</code>
  392.      * has no properties.
  393.      *
  394.      * @return      an <code>Enumeration</code> of <code>VisualProperty</code> objects.
  395.      */
  396.     public abstract Enumeration enumerateProperties();
  397.  
  398.     /**
  399.      * Opens an appropriate editor for this <code>VisualObject</code>.
  400.      */
  401.     public abstract void invokeEditor();
  402.  
  403.     /**
  404.      * Opens a source editor for this <code>VisualObject</code>'s source file.
  405.      */
  406.     public abstract void invokeSourceEditor();
  407.  
  408.     /**
  409.      * Performs a deep copy of this <code>VisualObject</code> and all its descendents.
  410.      * The new Object is not added to the project.
  411.      * @return a new copy of this <code>VisualObject</code>.
  412.      */
  413.     public abstract Object clone();
  414.  
  415.     /**
  416.      * Gets an <code>Image</code> for an icon that represents this <code>VisualObject</code>.
  417.      * @param iconKind the kind of icon to return.  Can be one of the four
  418.      *             kinds in java.beans.BeanInfo: ICON_COLOR_16x16, ICON_COLOR_32x32, ICON_MONO_16x16, or
  419.      *            ICON_MONO_32x32.
  420.      * @return an Image for this <code>VisualObject</code>.
  421.      */
  422.     public abstract Image getIcon(int iconKind);
  423.  
  424.     /**
  425.      * Determines if the contents of Visual Cafe's clipboard can be pasted
  426.      * onto/into this <code>VisualObject</code>.
  427.      * @return <code>false</code> if the clipboard doesn't contain <code>VisualObjects</code>, or this
  428.      * <code>VisualObject</code> cannot accept the <code>VisualObjects</code> on the clipboard.
  429.      * @see com.symantec.itools.vcafe.openapi.datatransfer.VisualCafeClipboard
  430.      * @see com.symantec.itools.vcafe.openapi.datatransfer.TransferableVisualObjects
  431.      */
  432.     public abstract boolean canPasteClipboardContents();
  433.  
  434.     /**
  435.      * Copies this <code>VisualObject</code> to Visual Cafe's clipboard.  
  436.      * The <code>VisualObject</code>'s <code>toString()</code> representation is used as the <code>StringSelection</code> text.
  437.      * @see com.symantec.itools.vcafe.openapi.datatransfer.VisualCafeClipboard
  438.      * @see com.symantec.itools.vcafe.openapi.datatransfer.TransferableVisualObjects
  439.      */
  440.     public abstract void copyToClipboard();
  441.  
  442.     /**
  443.      * Copies this <code>VisualObject</code> to Visual Cafe's clipboard.
  444.      * @param textValue the <code>String</code> to be used as the <code>StringSelection</code> text
  445.      * @see com.symantec.itools.vcafe.openapi.datatransfer.VisualCafeClipboard
  446.      * @see com.symantec.itools.vcafe.openapi.datatransfer.TransferableVisualObjects
  447.      */
  448.     public abstract void copyToClipboard(String textValue);
  449.  
  450.  
  451.     /**
  452.      * Determines if this <code>VisualObject</code> corresponds to a valid object in its <code>VisualProject</code>.
  453.      * @return <code>true</code> if so, <code>false</code> otherwise.
  454.      * @see #checkValidity
  455.      */
  456.     public abstract boolean isValid();
  457.  
  458.  
  459.     /**
  460.      * Determines if this <code>VisualObject</code> corresponds to a valid object in its <code>VisualProject</code>.
  461.      * <code>isValid()</code> is similar, but returns a boolean value indicating validity instead of throwing an
  462.      * <code>InvalidVisualObjectException</code> if the validity check fails.
  463.      * Note that the implementation of all of <code>VisualObject</code>'s abstract methods first call
  464.      * checkValidity().  Any method could therefore throw an <code>InvalidVisualObjectException</code>. 
  465.      *
  466.      * @exception InvalidVisualObjectException when using a <code>VisualObject</code> has been removed from its project,
  467.      * or its project has been closed, for example.
  468.      * @see #isValid
  469.      */
  470.     public void checkValidity() throws InvalidVisualObjectException {
  471.         if (!isValid()) throw new InvalidVisualObjectException();
  472.     }
  473.  
  474.     /**
  475.      * Gets the design-time reflection's DTClass object for this <code>VisualObject</code>'s type.
  476.      * The Design-Time Reflection package (com.symantec.itools.vcafe.openapi.dtreflect) provides services
  477.      * analogous to the Java reflection API, but is based upon parse information gathered by Visual Cafe. 
  478.      * Thus, classes reflected upon need not be compiled or in a compilable state.
  479.      * @return the <code>DTClass</code> of this object.
  480.      * @see com.symantec.itools.vcafe.openapi.dtreflect.DTClass
  481.      */
  482.     public abstract DTClass getDTClassObject();
  483.  
  484.     /**
  485.      * Gets the <code>java.lang.Class</code> object for this <code>VisualObject</code>'s type.
  486.      * @return the <code>Class</code> of this object.
  487.      */
  488.     public abstract Class getClassObject() throws ClassNotFoundException;
  489.  
  490.  
  491.     /**
  492.      * Creates a new <code>Object</code> that represents this <code>VisualObject</code>, with all of the
  493.      * properties set appropriately.
  494.      * For example, if this <code>VisualObject</code> describes a <code>java.awt.Checkbox</code>,
  495.      * a new checkbox is created and returned.
  496.      *
  497.      * @param thePropertyInstanceGetter an object that is used to determine Object Reference Properties
  498.      * @return a newly created <code>Object</code> defined by this <code>VisualObject</code>
  499.      */
  500.     public abstract Object instantiate(PropertyInstanceGetter thePropertyInstanceGetter)
  501.                             throws ClassNotFoundException, InstantiationException, IllegalAccessException;
  502.  
  503.     /**
  504.      * Updates the value of the Java object's property at the specified index to match the
  505.      * value of the corresponding <code>VisualProperty</code> in this <code>VisualObject</code>.
  506.      * @param propertyIndex the index of the property to update.
  507.      * @param instance the corresponding Java object to update.
  508.      * @param theInstanceGetter an object that is used to determine Object Reference Properties.
  509.      * @return the instance object if the Java object's property was updated successfully (this may be the same object
  510.      *            as the instance parameter, but may be a re-created object if necessary.  <code>null</code> is returned if the property
  511.      *            was not updated successfully.
  512.      * @exception ArrayIndexOutOfBoundsException if the <code>propertyIndex</code> is out of range.
  513.      */
  514.     public abstract Object updateInstanceProperty(int propertyIndex, Object instance, PropertyInstanceGetter thePropertyInstanceGetter)
  515.                             throws ClassNotFoundException, InstantiationException, IllegalAccessException;
  516.  
  517.     /**
  518.      * Sets this <code>VisualObject</code> as active in the Property List of Visual Cafe.
  519.      *
  520.      * @see VisualCafe#setActiveObjects
  521.      */
  522.     public abstract void setActiveObject();
  523.  
  524.     /**
  525.      * Sets this <code>VisualObject</code> as active in the Property List of Visual Cafe.
  526.      *
  527.      * @param forceDefaultProperty    force the default property for the object to be selected.
  528.      *                                if <code>false</code>, the previously selected property remains selected
  529.      *                                (if it exists for this object).
  530.      * @see VisualCafe#setActiveObjects(boolean)
  531.      */
  532.     public abstract void setActiveObject(boolean forceDefaultProperty);
  533.  
  534.     /**
  535.      * Add a <code>VisualObjectListener</code> to this <code>VisualObject</code>.
  536.      * All changes to this <code>VisualObject</code> (and optionally to its children) are broadcast
  537.      * to the listeners registered with it.
  538.      * @param listener the object that receives notifications of changes to the <code>VisualObject</code>.
  539.      * @param children <code>true</code> if the listener wishes to receive notifications of changes to
  540.      *                    this <code>VisualObject</code>'s children as well.
  541.      *
  542.      * @see VisualObjectListener
  543.      * @see    #removeVisualObjectListener
  544.      * @see VisualCafe#removeVisualObjectListener
  545.      */
  546.     public abstract void addVisualObjectListener(VisualObjectListener listener, boolean children);
  547.  
  548.     /**
  549.      * Remove a listener from this visual object.
  550.      * Stop receiving notifications of changes to this object
  551.      * @param listener the object that was receiving notifications
  552.      *
  553.      * @see VisualObjectListener
  554.      * @see    #addVisualObjectListener
  555.      * @see VisualCafe#removeVisualObjectListener
  556.      */
  557.     public abstract void removeVisualObjectListener(VisualObjectListener listener);
  558.  
  559.     /**
  560.      * Gets a <code>String</code> that represents this object.
  561.      * @return the <code>String</code>.
  562.      */
  563.     public String toString() {
  564.         if (!isValid()) return "invalid VisualObject: " + super.toString();
  565.         return "VisualObject[name=" + getName() + ",isJavaObject=" + isJavaObject() + ",class=" + getClassName() + "]";
  566.     }
  567.  
  568. }
  569.