weka.gui
Class GenericObjectEditor

java.lang.Object
  extended byweka.gui.GenericObjectEditor
All Implemented Interfaces:
CustomPanelSupplier, java.beans.PropertyEditor

public class GenericObjectEditor
extends java.lang.Object
implements java.beans.PropertyEditor, CustomPanelSupplier

A PropertyEditor for objects that themselves have been defined as editable in the GenericObjectEditor configuration file, which lists possible values that can be selected from, and themselves configured. The configuration file is called "GenericObjectEditor.props" and may live in either the location given by "user.home" or the current directory (this last will take precedence), and a default properties file is read from the weka distribution. For speed, the properties file is read only once when the class is first loaded -- this may need to be changed if we ever end up running in a Java OS ;-).

Version:
$Revision: 1.38 $
Author:
Len Trigg (trigg@cs.waikato.ac.nz), Xin Xu (xx5@cs.waikato.ac.nz), Richard Kirkby (rkirkby@cs.waikato.ac.nz)

Nested Class Summary
 class GenericObjectEditor.GOEPanel
          Handles the GUI side of editing values.
 class GenericObjectEditor.JTreePopupMenu
          Creates a popup menu containing a tree that is aware of the screen dimensions.
 
Field Summary
protected static java.util.Properties EDITOR_PROPERTIES
          Contains the editor properties
protected  java.lang.Object m_Backup
          Holds a copy of the current object that can be reverted to if the user decides to cancel
protected  boolean m_canChangeClassInDialog
           
protected  java.lang.Class m_ClassType
          The Class of objects being edited
protected  GenericObjectEditor.GOEPanel m_EditorComponent
          The GUI component for editing values, created when needed
protected  boolean m_Enabled
          True if the GUI component is needed
protected  java.lang.Object m_Object
          The object being configured
protected  HierarchyPropertyParser m_ObjectNames
          The model containing the list of names to select from
protected  PropertyPanel m_ObjectPropertyPanel
          The property panel created for the objects
protected  java.beans.PropertyChangeSupport m_Support
          Handles property change notification
protected  javax.swing.tree.DefaultMutableTreeNode m_treeNodeOfCurrentObject
          The tree node of the current object so we can re-select it for the user
protected static java.lang.String PROPERTY_FILE
          The name of the properties file
 
Constructor Summary
GenericObjectEditor()
          Default constructor.
GenericObjectEditor(boolean canChangeClassInDialog)
          Constructor that allows specifying whether it is possible to change the class within the editor dialog.
 
Method Summary
protected  void addChildrenToTree(javax.swing.tree.DefaultMutableTreeNode tree, HierarchyPropertyParser hpp)
          Recursively builds a JTree from an object heirarchy.
 void addPropertyChangeListener(java.beans.PropertyChangeListener l)
          Adds a PropertyChangeListener who will be notified of value changes.
protected  void classSelected(java.lang.String className)
          Called when the user selects an class type to change to.
protected  javax.swing.JButton createChooseClassButton()
          Creates a button that when clicked will enable the user to change the class of the object being edited.
protected  javax.swing.JTree createTree(HierarchyPropertyParser hpp)
          Creates a JTree from an object heirarchy.
 java.lang.String getAsText()
          Returns null as we don't support getting/setting values as text.
 javax.swing.JPopupMenu getChooseClassPopupMenu()
          Returns a popup menu that allows the user to change the class of object.
protected  HierarchyPropertyParser getClassesFromProperties()
          Called when the class of object being edited changes.
 java.awt.Component getCustomEditor()
          Returns the array editing component.
 javax.swing.JPanel getCustomPanel()
          Gets the custom panel used for editing the object.
 java.lang.String getJavaInitializationString()
          Supposedly returns an initialization string to create a Object identical to the current one, including it's state, but this doesn't appear possible given that the initialization string isn't supposed to contain multiple statements.
 java.lang.String[] getTags()
          Returns null as we don't support getting values as tags.
 java.lang.Object getValue()
          Gets the current Object.
 boolean isPaintable()
          Returns true to indicate that we can paint a representation of the Object.
static void main(java.lang.String[] args)
          Tests out the Object editor from the command line.
 void paintValue(java.awt.Graphics gfx, java.awt.Rectangle box)
          Paints a representation of the current Object.
 void removePropertyChangeListener(java.beans.PropertyChangeListener l)
          Removes a PropertyChangeListener.
 void setAsText(java.lang.String text)
          Returns null as we don't support getting/setting values as text.
 void setClassType(java.lang.Class type)
          Sets the class of values that can be edited.
 void setDefaultValue()
          Sets the current object to be the default, taken as the first item in the chooser
 void setEnabled(boolean newVal)
          Sets whether the editor is "enabled", meaning that the current values will be painted.
protected  void setObject(java.lang.Object c)
          Sets the current Object.
 void setValue(java.lang.Object o)
          Sets the current Object.
 boolean supportsCustomEditor()
          Returns true because we do support a custom editor.
protected  void updateObjectNames()
          Updates the list of selectable object names, adding any new names to the list.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

m_Object

protected java.lang.Object m_Object
The object being configured


m_Backup

protected java.lang.Object m_Backup
Holds a copy of the current object that can be reverted to if the user decides to cancel


m_Support

protected java.beans.PropertyChangeSupport m_Support
Handles property change notification


m_ClassType

protected java.lang.Class m_ClassType
The Class of objects being edited


m_ObjectNames

protected HierarchyPropertyParser m_ObjectNames
The model containing the list of names to select from


m_EditorComponent

protected GenericObjectEditor.GOEPanel m_EditorComponent
The GUI component for editing values, created when needed


m_Enabled

protected boolean m_Enabled
True if the GUI component is needed


PROPERTY_FILE

protected static java.lang.String PROPERTY_FILE
The name of the properties file


EDITOR_PROPERTIES

protected static java.util.Properties EDITOR_PROPERTIES
Contains the editor properties


m_treeNodeOfCurrentObject

protected javax.swing.tree.DefaultMutableTreeNode m_treeNodeOfCurrentObject
The tree node of the current object so we can re-select it for the user


m_ObjectPropertyPanel

protected PropertyPanel m_ObjectPropertyPanel
The property panel created for the objects


m_canChangeClassInDialog

protected boolean m_canChangeClassInDialog
Constructor Detail

GenericObjectEditor

public GenericObjectEditor()
Default constructor.


GenericObjectEditor

public GenericObjectEditor(boolean canChangeClassInDialog)
Constructor that allows specifying whether it is possible to change the class within the editor dialog.

Parameters:
canChangeClassInDialog - whether the user can change the class
Method Detail

getClassesFromProperties

protected HierarchyPropertyParser getClassesFromProperties()
Called when the class of object being edited changes.


updateObjectNames

protected void updateObjectNames()
Updates the list of selectable object names, adding any new names to the list.


setEnabled

public void setEnabled(boolean newVal)
Sets whether the editor is "enabled", meaning that the current values will be painted.

Parameters:
newVal - a value of type 'boolean'

setClassType

public void setClassType(java.lang.Class type)
Sets the class of values that can be edited.

Parameters:
type - a value of type 'Class'

setDefaultValue

public void setDefaultValue()
Sets the current object to be the default, taken as the first item in the chooser


setValue

public void setValue(java.lang.Object o)
Sets the current Object. If the Object is in the Object chooser, this becomes the selected item (and added to the chooser if necessary).

Specified by:
setValue in interface java.beans.PropertyEditor
Parameters:
o - an object that must be a Object.

setObject

protected void setObject(java.lang.Object c)
Sets the current Object.

Parameters:
c - a value of type 'Object'

getValue

public java.lang.Object getValue()
Gets the current Object.

Specified by:
getValue in interface java.beans.PropertyEditor
Returns:
the current Object

getJavaInitializationString

public java.lang.String getJavaInitializationString()
Supposedly returns an initialization string to create a Object identical to the current one, including it's state, but this doesn't appear possible given that the initialization string isn't supposed to contain multiple statements.

Specified by:
getJavaInitializationString in interface java.beans.PropertyEditor
Returns:
the java source code initialisation string

isPaintable

public boolean isPaintable()
Returns true to indicate that we can paint a representation of the Object.

Specified by:
isPaintable in interface java.beans.PropertyEditor
Returns:
true

paintValue

public void paintValue(java.awt.Graphics gfx,
                       java.awt.Rectangle box)
Paints a representation of the current Object.

Specified by:
paintValue in interface java.beans.PropertyEditor
Parameters:
gfx - the graphics context to use
box - the area we are allowed to paint into

getAsText

public java.lang.String getAsText()
Returns null as we don't support getting/setting values as text.

Specified by:
getAsText in interface java.beans.PropertyEditor
Returns:
null

setAsText

public void setAsText(java.lang.String text)
Returns null as we don't support getting/setting values as text.

Specified by:
setAsText in interface java.beans.PropertyEditor
Parameters:
text - the text value
Throws:
java.lang.IllegalArgumentException - as we don't support getting/setting values as text.

getTags

public java.lang.String[] getTags()
Returns null as we don't support getting values as tags.

Specified by:
getTags in interface java.beans.PropertyEditor
Returns:
null

supportsCustomEditor

public boolean supportsCustomEditor()
Returns true because we do support a custom editor.

Specified by:
supportsCustomEditor in interface java.beans.PropertyEditor
Returns:
true

getCustomEditor

public java.awt.Component getCustomEditor()
Returns the array editing component.

Specified by:
getCustomEditor in interface java.beans.PropertyEditor
Returns:
a value of type 'java.awt.Component'

addPropertyChangeListener

public void addPropertyChangeListener(java.beans.PropertyChangeListener l)
Adds a PropertyChangeListener who will be notified of value changes.

Specified by:
addPropertyChangeListener in interface java.beans.PropertyEditor
Parameters:
l - a value of type 'PropertyChangeListener'

removePropertyChangeListener

public void removePropertyChangeListener(java.beans.PropertyChangeListener l)
Removes a PropertyChangeListener.

Specified by:
removePropertyChangeListener in interface java.beans.PropertyEditor
Parameters:
l - a value of type 'PropertyChangeListener'

getCustomPanel

public javax.swing.JPanel getCustomPanel()
Gets the custom panel used for editing the object.

Specified by:
getCustomPanel in interface CustomPanelSupplier
Returns:
the custom JPanel

createChooseClassButton

protected javax.swing.JButton createChooseClassButton()
Creates a button that when clicked will enable the user to change the class of the object being edited.


getChooseClassPopupMenu

public javax.swing.JPopupMenu getChooseClassPopupMenu()
Returns a popup menu that allows the user to change the class of object.

Returns:
a JPopupMenu that when shown will let the user choose the class

createTree

protected javax.swing.JTree createTree(HierarchyPropertyParser hpp)
Creates a JTree from an object heirarchy.

Parameters:
hpp - the hierarchy of objects to mirror in the tree
Returns:
a JTree representation of the hierarchy

addChildrenToTree

protected void addChildrenToTree(javax.swing.tree.DefaultMutableTreeNode tree,
                                 HierarchyPropertyParser hpp)
Recursively builds a JTree from an object heirarchy. Also updates m_treeNodeOfCurrentObject if the current object is discovered during creation.

Parameters:
tree - the root of the tree to add children to
hpp - the hierarchy of objects to mirror in the tree

classSelected

protected void classSelected(java.lang.String className)
Called when the user selects an class type to change to.

Parameters:
className - the name of the class that was selected

main

public static void main(java.lang.String[] args)
Tests out the Object editor from the command line.

Parameters:
args - may contain the class name of a Object to edit