Repaired GenericArrayEditor (merge from mk-branch, rev. 110)

This commit is contained in:
Marcel Kronfeld 2008-07-03 13:13:34 +00:00
parent 34075b8c97
commit 8d14ff6c1b
5 changed files with 69 additions and 44 deletions

View File

@ -5,6 +5,7 @@ package eva2;
* *
* --- Changelog * --- Changelog
* *
* Repaired the GenericArrayEditor.
* 2.026: Added DiversityTerminator and KnownOptimaTerminator, slightly changed InterfaceTerminator for these * 2.026: Added DiversityTerminator and KnownOptimaTerminator, slightly changed InterfaceTerminator for these
* and InterfaceStatistics to provide termination message to text window. * and InterfaceStatistics to provide termination message to text window.
* Killed redundant method getGenerations() in Population. Population.getAllSolutions now returns a * Killed redundant method getGenerations() in Population. Population.getAllSolutions now returns a

View File

@ -14,31 +14,40 @@ package eva2.gui;
*==========================================================================*/ *==========================================================================*/
import java.awt.*; import java.awt.BorderLayout;
import java.awt.event.*; import java.awt.Component;
import javax.swing.JPanel; 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.JLabel;
import javax.swing.JList; 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.event.ListSelectionListener;
import javax.swing.ListCellRenderer; import eva2.server.go.problems.DiscType;
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.tools.EVAHELP; import eva2.tools.EVAHELP;
import eva2.tools.SelectedTag; 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 * CLASS DECLARATION
*==========================================================================*/ *==========================================================================*/
@ -74,6 +83,7 @@ implements PropertyEditor {
if (m_ListModel.size() > current) { if (m_ListModel.size() > current) {
m_ElementList.setSelectedIndex(current); m_ElementList.setSelectedIndex(current);
} }
m_ElementList.setModel(m_ListModel);
} }
m_Support.firePropertyChange("", null, null); m_Support.firePropertyChange("", null, null);
} }
@ -93,6 +103,7 @@ implements PropertyEditor {
} else { } else {
m_ListModel.addElement(addObj); m_ListModel.addElement(addObj);
} }
m_ElementList.setModel(m_ListModel);
m_Support.firePropertyChange("", null, null); m_Support.firePropertyChange("", null, null);
} catch (Exception ex) { } catch (Exception ex) {
JOptionPane.showMessageDialog(GenericArrayEditor.this,"Could not create an object copy",null,JOptionPane.ERROR_MESSAGE); 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) { if (e.getSource() == m_ElementList) {
// Enable the delete button // Enable the delete button
//System.out.println("m_ElementList.getSelectedIndex()"+m_ElementList.getSelectedIndex());
if (m_ElementList.getSelectedIndex() != -1) { if (m_ElementList.getSelectedIndex() != -1) {
m_DeleteBut.setEnabled(true); m_DeleteBut.setEnabled(true);
m_ElementEditor.setValue(m_ElementList.getSelectedValue());
} }
} }
} }
@ -360,7 +371,7 @@ implements PropertyEditor {
FontMetrics fm = gfx.getFontMetrics(); FontMetrics fm = gfx.getFontMetrics();
int vpad = (box.height - fm.getAscent()) / 2; int vpad = (box.height - fm.getAscent()) / 2;
// System.out.println(m_ListModel + " --- " + m_ElementClass); // 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 ); gfx.drawString(rep, 2, fm.getHeight() + vpad - 3 );
} }
/** /**
@ -412,11 +423,13 @@ implements PropertyEditor {
public static void main(String [] args) { public static void main(String [] args) {
try { try {
java.beans.PropertyEditorManager.registerEditor(SelectedTag.class,TagEditor.class); 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); java.beans.PropertyEditorManager.registerEditor(double [].class,GenericArrayEditor.class);
GenericArrayEditor editor = new GenericArrayEditor(); 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()) PropertyDialog pd = new PropertyDialog(editor,EVAHELP.cutClassName(editor.getClass().getName())
, 100, 100); , 100, 100);
pd.setSize(200,200); pd.setSize(200,200);

View File

@ -452,8 +452,8 @@ public class GenericObjectEditor implements PropertyEditor {
// setObject(dummy); // setObject(dummy);
// } else { // } else {
if (TRACE) System.out.println(className); if (TRACE) System.out.println(className);
Object n = (Object)Class.forName(className, true, this.getClass().getClassLoader()).newInstance(); // Object n = (Object)Class.forName(className, true, this.getClass().getClassLoader()).newInstance();
n = (Object)Class.forName(className).newInstance(); Object n = (Object)Class.forName(className).newInstance();
setObject(n); setObject(n);
// } // }
} catch (Exception ex) { } catch (Exception ex) {

View File

@ -1,24 +1,24 @@
package eva2.gui; package eva2.gui;
import java.awt.Color; import java.awt.Color;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor; import java.beans.PropertyDescriptor;
import java.beans.PropertyEditor; import java.beans.PropertyEditor;
import java.beans.PropertyEditorManager; import java.beans.PropertyEditorManager;
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.BoolEditor;
import sun.beans.editors.ByteEditor; import sun.beans.editors.ByteEditor;
import sun.beans.editors.ColorEditor; import sun.beans.editors.ColorEditor;
import sun.beans.editors.ShortEditor; import sun.beans.editors.DoubleEditor;
import sun.beans.editors.FloatEditor; import sun.beans.editors.FloatEditor;
import sun.beans.editors.IntEditor;
import sun.beans.editors.LongEditor; import sun.beans.editors.LongEditor;
import sun.beans.editors.ShortEditor;
import sun.beans.editors.StringEditor; import sun.beans.editors.StringEditor;
import eva2.server.go.InterfaceTerminator;
import eva2.server.go.individuals.codings.gp.GPArea;
import eva2.tools.SelectedTag;
public class PropertyEditorProvider { public class PropertyEditorProvider {
final static boolean TRACE = false; final static boolean TRACE = false;
@ -26,15 +26,22 @@ public class PropertyEditorProvider {
// unless you want to register every single possibility. // unless you want to register every single possibility.
public static boolean useDefaultGOE = true; 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; PropertyEditor editor = null;
editor = PropertyEditorManager.findEditor(cls); 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 ) { if ((editor == null) && useDefaultGOE ) {
editor = new GenericObjectEditor(); if (cls.isArray()) editor = new GenericArrayEditor();
if (TRACE) System.out.println("using GOE"); 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; return editor;
} }
@ -111,8 +118,9 @@ public class PropertyEditorProvider {
if (editor == null) editor = PropertyEditorManager.findEditor(type); if (editor == null) editor = PropertyEditorManager.findEditor(type);
if (TRACE) System.out.println((editor == null ) ? "No editor from PEM by type" : ("Found " + editor.getClass())); if (TRACE) System.out.println((editor == null ) ? "No editor from PEM by type" : ("Found " + editor.getClass()));
if ((editor == null) && useDefaultGOE ) { if ((editor == null) && useDefaultGOE ) {
editor = new GenericObjectEditor(); if (type.isArray()) editor = new GenericArrayEditor();
if (TRACE) System.out.println("using GOE"); else editor = new GenericObjectEditor();
if (TRACE) System.out.println("using GOE/GAE");
} }
} }
if (editor == null) { if (editor == null) {
@ -128,7 +136,7 @@ public class PropertyEditorProvider {
// ((GenericObjectEditor) editor).getCustomEditor(); // ((GenericObjectEditor) editor).getCustomEditor();
((GenericObjectEditor) editor).setClassType(type); ((GenericObjectEditor) editor).setClassType(type);
} }
if (TRACE) System.out.println("+ using "+ editor.getClass().getName() + " for " + value.getClass().getName());
return editor; return editor;
} }
@ -136,6 +144,7 @@ public class PropertyEditorProvider {
*/ */
public static void installEditors() { public static void installEditors() {
PropertyEditorManager.registerEditor(SelectedTag.class, TagEditor.class); PropertyEditorManager.registerEditor(SelectedTag.class, TagEditor.class);
PropertyEditorManager.registerEditor(int[].class, GenericArrayEditor.class);
PropertyEditorManager.registerEditor(double[].class, GenericArrayEditor.class); PropertyEditorManager.registerEditor(double[].class, GenericArrayEditor.class);
PropertyEditorManager.registerEditor(InterfaceTerminator[].class, GenericArrayEditor.class); PropertyEditorManager.registerEditor(InterfaceTerminator[].class, GenericArrayEditor.class);

View File

@ -519,7 +519,9 @@ public class PropertySheetPanel extends JPanel implements PropertyChangeListener
PropertyEditor tmpEdit = null; PropertyEditor tmpEdit = null;
Object newValue = evt.getNewValue(); Object newValue = evt.getNewValue();
if (newValue == null) newValue = editor.getValue(); 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 == null) tmpEdit = PropertyEditorProvider.findEditor(m_Properties[i].getPropertyType());
if (tmpEdit.getClass() != m_Editors[i].getClass()) { if (tmpEdit.getClass() != m_Editors[i].getClass()) {
value = newValue; value = newValue;