diff --git a/src/eva2/EvAInfo.java b/src/eva2/EvAInfo.java index ca6d5429..253d2105 100644 --- a/src/eva2/EvAInfo.java +++ b/src/eva2/EvAInfo.java @@ -5,6 +5,7 @@ package eva2; * * --- Changelog * + * Repaired the GenericArrayEditor. * 2.026: Added DiversityTerminator and KnownOptimaTerminator, slightly changed InterfaceTerminator for these * and InterfaceStatistics to provide termination message to text window. * Killed redundant method getGenerations() in Population. Population.getAllSolutions now returns a diff --git a/src/eva2/gui/GenericArrayEditor.java b/src/eva2/gui/GenericArrayEditor.java index 68308536..3212dd8d 100644 --- a/src/eva2/gui/GenericArrayEditor.java +++ b/src/eva2/gui/GenericArrayEditor.java @@ -14,31 +14,40 @@ package eva2.gui; *==========================================================================*/ -import java.awt.*; -import java.awt.event.*; -import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Insets; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.beans.PropertyEditor; +import java.lang.reflect.Array; + +import javax.swing.DefaultListCellRenderer; +import javax.swing.DefaultListModel; +import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JList; -import javax.swing.JButton; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.ListCellRenderer; +import javax.swing.SwingConstants; +import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import javax.swing.ListCellRenderer; -import javax.swing.event.ListSelectionEvent; -import javax.swing.SwingConstants; -import javax.swing.JOptionPane; -import javax.swing.DefaultListModel; -import javax.swing.JScrollPane; -import javax.swing.DefaultListCellRenderer; - +import eva2.server.go.problems.DiscType; import eva2.tools.EVAHELP; import eva2.tools.SelectedTag; - -import java.beans.PropertyEditor; -import java.beans.PropertyChangeSupport; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyEditorManager; -import java.lang.reflect.Array; /*==========================================================================* * CLASS DECLARATION *==========================================================================*/ @@ -74,6 +83,7 @@ implements PropertyEditor { if (m_ListModel.size() > current) { m_ElementList.setSelectedIndex(current); } + m_ElementList.setModel(m_ListModel); } m_Support.firePropertyChange("", null, null); } @@ -93,6 +103,7 @@ implements PropertyEditor { } else { m_ListModel.addElement(addObj); } + m_ElementList.setModel(m_ListModel); m_Support.firePropertyChange("", null, null); } catch (Exception ex) { JOptionPane.showMessageDialog(GenericArrayEditor.this,"Could not create an object copy",null,JOptionPane.ERROR_MESSAGE); @@ -109,9 +120,9 @@ implements PropertyEditor { if (e.getSource() == m_ElementList) { // Enable the delete button - //System.out.println("m_ElementList.getSelectedIndex()"+m_ElementList.getSelectedIndex()); if (m_ElementList.getSelectedIndex() != -1) { m_DeleteBut.setEnabled(true); + m_ElementEditor.setValue(m_ElementList.getSelectedValue()); } } } @@ -360,7 +371,7 @@ implements PropertyEditor { FontMetrics fm = gfx.getFontMetrics(); int vpad = (box.height - fm.getAscent()) / 2; // System.out.println(m_ListModel + " --- " + m_ElementClass); - String rep = m_ListModel.getSize() + " " + EVAHELP.cutClassName(m_ElementClass.getName()); + String rep = m_ListModel.getSize() + " of " + EVAHELP.cutClassName(m_ElementClass.getName()); gfx.drawString(rep, 2, fm.getHeight() + vpad - 3 ); } /** @@ -412,11 +423,13 @@ implements PropertyEditor { public static void main(String [] args) { try { java.beans.PropertyEditorManager.registerEditor(SelectedTag.class,TagEditor.class); - java.beans.PropertyEditorManager.registerEditor(String [].class,GenericArrayEditor.class); + java.beans.PropertyEditorManager.registerEditor(int [].class,GenericArrayEditor.class); java.beans.PropertyEditorManager.registerEditor(double [].class,GenericArrayEditor.class); GenericArrayEditor editor = new GenericArrayEditor(); + - double [] initial = { 1, 2, 34,656,46 }; + DiscType[] initial = { new DiscType(3,4.), new DiscType(5, 7.)}; + editor.setValue(initial); PropertyDialog pd = new PropertyDialog(editor,EVAHELP.cutClassName(editor.getClass().getName()) , 100, 100); pd.setSize(200,200); diff --git a/src/eva2/gui/GenericObjectEditor.java b/src/eva2/gui/GenericObjectEditor.java index 297966ea..73064e26 100644 --- a/src/eva2/gui/GenericObjectEditor.java +++ b/src/eva2/gui/GenericObjectEditor.java @@ -452,8 +452,8 @@ public class GenericObjectEditor implements PropertyEditor { // setObject(dummy); // } else { if (TRACE) System.out.println(className); - Object n = (Object)Class.forName(className, true, this.getClass().getClassLoader()).newInstance(); - n = (Object)Class.forName(className).newInstance(); +// Object n = (Object)Class.forName(className, true, this.getClass().getClassLoader()).newInstance(); + Object n = (Object)Class.forName(className).newInstance(); setObject(n); // } } catch (Exception ex) { diff --git a/src/eva2/gui/PropertyEditorProvider.java b/src/eva2/gui/PropertyEditorProvider.java index 7aea23aa..449fa786 100644 --- a/src/eva2/gui/PropertyEditorProvider.java +++ b/src/eva2/gui/PropertyEditorProvider.java @@ -1,40 +1,47 @@ package eva2.gui; import java.awt.Color; +import java.beans.BeanInfo; +import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.beans.PropertyEditor; import java.beans.PropertyEditorManager; +import sun.beans.editors.BoolEditor; +import sun.beans.editors.ByteEditor; +import sun.beans.editors.ColorEditor; +import sun.beans.editors.DoubleEditor; +import sun.beans.editors.FloatEditor; +import sun.beans.editors.IntEditor; +import sun.beans.editors.LongEditor; +import sun.beans.editors.ShortEditor; +import sun.beans.editors.StringEditor; import eva2.server.go.InterfaceTerminator; import eva2.server.go.individuals.codings.gp.GPArea; import eva2.tools.SelectedTag; - -import sun.beans.editors.DoubleEditor; -import sun.beans.editors.IntEditor; -import sun.beans.editors.BoolEditor; -import sun.beans.editors.ByteEditor; -import sun.beans.editors.ColorEditor; -import sun.beans.editors.ShortEditor; -import sun.beans.editors.FloatEditor; -import sun.beans.editors.LongEditor; -import sun.beans.editors.StringEditor; - public class PropertyEditorProvider { final static boolean TRACE = false; // if true, we use the GenericObjectEditor whenever no specific one is registered, so keep it true // unless you want to register every single possibility. public static boolean useDefaultGOE = true; - public static PropertyEditor findEditor(Class cls) { + /** + * Retrieve an editor object for a given class. + * This method seems unable to retrieve a primitive editor for obscure reasons. + * So better use the one based on PropertyDescriptor if possible. + */ + public static PropertyEditor findEditor(Class cls) { PropertyEditor editor = null; editor = PropertyEditorManager.findEditor(cls); - if (TRACE) System.out.println((editor == null ) ? "No editor from PEM" : ("Found " + editor.getClass())); +// if (TRACE) System.out.println((editor == null ) ? "No editor from PEM" : ("Found " + editor.getClass())); if ((editor == null) && useDefaultGOE ) { - editor = new GenericObjectEditor(); - if (TRACE) System.out.println("using GOE"); + if (cls.isArray()) editor = new GenericArrayEditor(); + else editor = new GenericObjectEditor(); +// if (TRACE) System.out.println("using GOE/GAE"); } + if (TRACE) System.out.println("# using "+ editor.getClass().getName() + " for " + cls.getName()); return editor; } @@ -111,8 +118,9 @@ public class PropertyEditorProvider { if (editor == null) editor = PropertyEditorManager.findEditor(type); if (TRACE) System.out.println((editor == null ) ? "No editor from PEM by type" : ("Found " + editor.getClass())); if ((editor == null) && useDefaultGOE ) { - editor = new GenericObjectEditor(); - if (TRACE) System.out.println("using GOE"); + if (type.isArray()) editor = new GenericArrayEditor(); + else editor = new GenericObjectEditor(); + if (TRACE) System.out.println("using GOE/GAE"); } } if (editor == null) { @@ -128,7 +136,7 @@ public class PropertyEditorProvider { // ((GenericObjectEditor) editor).getCustomEditor(); ((GenericObjectEditor) editor).setClassType(type); } - + if (TRACE) System.out.println("+ using "+ editor.getClass().getName() + " for " + value.getClass().getName()); return editor; } @@ -136,6 +144,7 @@ public class PropertyEditorProvider { */ public static void installEditors() { PropertyEditorManager.registerEditor(SelectedTag.class, TagEditor.class); + PropertyEditorManager.registerEditor(int[].class, GenericArrayEditor.class); PropertyEditorManager.registerEditor(double[].class, GenericArrayEditor.class); PropertyEditorManager.registerEditor(InterfaceTerminator[].class, GenericArrayEditor.class); diff --git a/src/eva2/gui/PropertySheetPanel.java b/src/eva2/gui/PropertySheetPanel.java index 253ac620..82362a20 100644 --- a/src/eva2/gui/PropertySheetPanel.java +++ b/src/eva2/gui/PropertySheetPanel.java @@ -519,7 +519,9 @@ public class PropertySheetPanel extends JPanel implements PropertyChangeListener PropertyEditor tmpEdit = null; Object newValue = evt.getNewValue(); if (newValue == null) newValue = editor.getValue(); - tmpEdit = PropertyEditorProvider.findEditor(newValue.getClass()); + // the findEditor method using properties may retrieve a primitive editor, the other one, for obscure reasons, cant. + // so Ill use the mightier first. + tmpEdit = PropertyEditorProvider.findEditor(m_Properties[i], newValue); if (tmpEdit == null) tmpEdit = PropertyEditorProvider.findEditor(m_Properties[i].getPropertyType()); if (tmpEdit.getClass() != m_Editors[i].getClass()) { value = newValue;