diff --git a/src/antidote/ChangeLog b/src/antidote/ChangeLog index 30bf50f5d..d33973158 100644 --- a/src/antidote/ChangeLog +++ b/src/antidote/ChangeLog @@ -1,3 +1,12 @@ +2000-11-18 Simeon H.K. Fitch + + * org/apache/tools/ant/gui/customizer/PropertiesPropertyEditor.java: + Added proper editing capability. Rows are added and removed + automatically. + + * org/apache/tools/ant/gui/customizer/XXXPropertyEditor.java: + Removed stray event firing upon setting value of property to edit. + 2000-11-16 Simeon H.K. Fitch * org/apache/tools/ant/gui/customizer/StringPropertyEditor.java: diff --git a/src/antidote/org/apache/tools/ant/gui/PropertyEditor.java b/src/antidote/org/apache/tools/ant/gui/PropertyEditor.java index 6329ffa78..6d4260d9d 100644 --- a/src/antidote/org/apache/tools/ant/gui/PropertyEditor.java +++ b/src/antidote/org/apache/tools/ant/gui/PropertyEditor.java @@ -63,6 +63,7 @@ import java.io.StringReader; import java.io.IOException; import java.awt.BorderLayout; import java.awt.Component; +import java.awt.Point; /** * Stub for a property editor. @@ -76,6 +77,8 @@ class PropertyEditor extends AntEditor { private Customizer _customizer = null; /** Container for the customizer. */ private JPanel _container = null; + /** Scroll area containing contents. */ + private JScrollPane _scroller = null; /** * Standard ctor. @@ -87,7 +90,7 @@ class PropertyEditor extends AntEditor { context.getEventBus().addMember(EventBus.MONITORING, new Handler()); setLayout(new BorderLayout()); _container = new JPanel(new BorderLayout()); - add(new JScrollPane(_container)); + add(_scroller = new JScrollPane(_container)); } /** @@ -115,7 +118,7 @@ class PropertyEditor extends AntEditor { } } - validate(); + _container.revalidate(); } diff --git a/src/antidote/org/apache/tools/ant/gui/acs/ACSElement.java b/src/antidote/org/apache/tools/ant/gui/acs/ACSElement.java index a4ad0e277..73001d539 100644 --- a/src/antidote/org/apache/tools/ant/gui/acs/ACSElement.java +++ b/src/antidote/org/apache/tools/ant/gui/acs/ACSElement.java @@ -103,7 +103,7 @@ public abstract class ACSElement extends ElementNode { * @param value Value of the attribute. */ public void setAttribute(String name, String value) { - if(value == null || value.length() == 0) { + if(value == null && getAttribute(name).length() != 0) { removeAttribute(name); } else { diff --git a/src/antidote/org/apache/tools/ant/gui/customizer/AbstractPropertyEditor.java b/src/antidote/org/apache/tools/ant/gui/customizer/AbstractPropertyEditor.java index 6534a71c2..3bee7c5a9 100644 --- a/src/antidote/org/apache/tools/ant/gui/customizer/AbstractPropertyEditor.java +++ b/src/antidote/org/apache/tools/ant/gui/customizer/AbstractPropertyEditor.java @@ -57,6 +57,7 @@ import java.beans.*; import java.awt.Graphics; import java.awt.Component; import java.awt.Rectangle; +import java.awt.Dimension; import javax.swing.JComponent; import java.awt.event.FocusEvent; import java.awt.event.FocusAdapter; @@ -71,8 +72,9 @@ public abstract class AbstractPropertyEditor implements PropertyEditor { /** Bean property change property name. */ public static final String BEAN_PROP = "BeanEditorProperty"; - + /** Event listener support. */ private PropertyChangeSupport _listeners = new PropertyChangeSupport(this); + /** * Default constructor. * diff --git a/src/antidote/org/apache/tools/ant/gui/customizer/DoublePropertyEditor.java b/src/antidote/org/apache/tools/ant/gui/customizer/DoublePropertyEditor.java index 8ba7db30e..8ef746993 100644 --- a/src/antidote/org/apache/tools/ant/gui/customizer/DoublePropertyEditor.java +++ b/src/antidote/org/apache/tools/ant/gui/customizer/DoublePropertyEditor.java @@ -117,8 +117,6 @@ public class DoublePropertyEditor extends AbstractPropertyEditor { } _widget.setText(value.toString()); - - firePropertyChange(old, value); } /** @@ -155,7 +153,6 @@ public class DoublePropertyEditor extends AbstractPropertyEditor { } text = val.toString(); _widget.setText(text); - firePropertyChange(old, text); } /** diff --git a/src/antidote/org/apache/tools/ant/gui/customizer/IntegerPropertyEditor.java b/src/antidote/org/apache/tools/ant/gui/customizer/IntegerPropertyEditor.java index ccd6077e8..b94fd397c 100644 --- a/src/antidote/org/apache/tools/ant/gui/customizer/IntegerPropertyEditor.java +++ b/src/antidote/org/apache/tools/ant/gui/customizer/IntegerPropertyEditor.java @@ -117,8 +117,6 @@ public class IntegerPropertyEditor extends AbstractPropertyEditor { } _widget.setText(value.toString()); - - firePropertyChange(old, value); } /** @@ -155,7 +153,6 @@ public class IntegerPropertyEditor extends AbstractPropertyEditor { } text = val.toString(); _widget.setText(text); - firePropertyChange(old, text); } /** diff --git a/src/antidote/org/apache/tools/ant/gui/customizer/PropertiesPropertyEditor.java b/src/antidote/org/apache/tools/ant/gui/customizer/PropertiesPropertyEditor.java index 25b4c6eb9..d983049b7 100644 --- a/src/antidote/org/apache/tools/ant/gui/customizer/PropertiesPropertyEditor.java +++ b/src/antidote/org/apache/tools/ant/gui/customizer/PropertiesPropertyEditor.java @@ -67,8 +67,15 @@ import java.util.*; * @author Simeon Fitch */ public class PropertiesPropertyEditor extends AbstractPropertyEditor { + /** Recommended size for widgets inside a JScrollPane, as communicated + * through the setPreferredScrollableViewportSize() method. */ + protected static final Dimension VIEWPORT_SIZE = new Dimension(200, 50); + + /** Container. */ private JPanel _widget = null; - private Properties _value = null; + /* The current properties being edited. */ + private Properties _properties = null; + /** The table editor for the properties. */ private JTable _table = null; /** @@ -80,7 +87,7 @@ public class PropertiesPropertyEditor extends AbstractPropertyEditor { _widget.addFocusListener(new FocusHandler(this)); _table = new JTable(); - _table.setPreferredScrollableViewportSize(new Dimension(300, 100)); + _table.setPreferredScrollableViewportSize(VIEWPORT_SIZE); JScrollPane scroller = new JScrollPane(_table); _widget.add(BorderLayout.CENTER, scroller); } @@ -126,20 +133,21 @@ public class PropertiesPropertyEditor extends AbstractPropertyEditor { value.getClass().getName() + " is not of type Properties."); } - Object old = _value; - _value = (Properties) value; - - _table.setModel(new PropertiesTableModel(_value)); + Object old = _properties; + _properties = (Properties) ((Properties) value).clone(); - firePropertyChange(old, value); + PropertiesTableModel model = new PropertiesTableModel(); + _table.setModel(model); + _table.clearSelection(); } /** - * @return The value of the property. Builtin types such as "int" will - * be wrapped as the corresponding object type such as "java.lang.Integer". + * @return The value of the property. Builtin types + * such as "int" will be wrapped as the corresponding + * object type such as "java.lang.Integer". */ public Object getValue() { - return _value; + return _properties; } /** @@ -165,46 +173,132 @@ public class PropertiesPropertyEditor extends AbstractPropertyEditor { } /** Table model view of the Properties object. */ - private static class PropertiesTableModel extends AbstractTableModel { + private class PropertiesTableModel extends AbstractTableModel { private static final int NAME = 0; private static final int VALUE = 1; - private Properties _properties = null; - private String[] _keys = null; - - public PropertiesTableModel(Properties props) { - _properties = props; + private List _keys = null; - Enumeration enum = _properties.keys(); - _keys = new String[_properties.size()]; - for(int i = 0; enum.hasMoreElements(); i++) { - String key = (String) enum.nextElement(); - _keys[i] = key; - } + public PropertiesTableModel() { + // We need to store the property keys in an array + // so that the ordering is preserved. + _keys = new ArrayList(_properties.keySet()); + Collections.sort(_keys); } + /** + * Get the number of rows. + * + * @return Number of rows. + */ public int getRowCount() { - return _keys.length; + return _properties.size() + 1; } + /** + * Get the number of columns. + * + * @return 2 + */ public int getColumnCount() { return 2; } + /** + * Get the editing and display class of the given column. + * + * @return String.class + */ + public Class getColumnClass(int column) { + return String.class; + } + + /** + * Get the header name of the column. + * + * @param column Column index. + * @return Name of the column. + */ public String getColumnName(int column) { // XXX fix me. return column == NAME ? "Name" : "Value"; } + + /** + * Determine if the given cell is editable. + * + * @param row Cell row. + * @param column Cell column. + * @return true + */ + public boolean isCellEditable(int row, int column) { + return true; + } + + /** + * Get the object at the given table coordinates. + * + * @param row Table row. + * @param column Table column. + * @return Object at location, or null if none. + */ public Object getValueAt(int row, int column) { - switch(column) { - case NAME: return _keys[row]; - case VALUE: return _properties.getProperty(_keys[row]); + if(row < _properties.size()) { + switch(column) { + case NAME: + return _keys.get(row); + case VALUE: + return _properties.getProperty((String)_keys.get(row)); + } } return null; } - } + /** + * Set the table value at the given location. + * + * @param value Value to set. + * @param row Row. + * @param column Column. + */ + public void setValueAt(Object value, int row, int column) { + String k = null; + String v = null; + + String currKey = (String) getValueAt(row, NAME); + switch(column) { + case NAME: + k = String.valueOf(value); + if(row < _keys.size()) { + _keys.set(row, k); + } + else { + _keys.add(k); + } + String currValue = null; + if(currKey != null) { + currValue = _properties.getProperty(currKey); + _properties.remove(currKey); + } + v = currValue == null ? "" : currValue; + break; + case VALUE: + v = String.valueOf(value); + k = currKey; + if(k == null || k.length() == 0) { + k = "key-for-" + v; + } + break; + } + if(k.length() > 0) { + _properties.setProperty(k, v); + } + fireTableRowsUpdated(row, row); + // Fire change in outer class. + firePropertyChange(null, _properties); + } + } } diff --git a/src/antidote/org/apache/tools/ant/gui/customizer/StringArrayPropertyEditor.java b/src/antidote/org/apache/tools/ant/gui/customizer/StringArrayPropertyEditor.java index 1212a40ca..561aadf61 100644 --- a/src/antidote/org/apache/tools/ant/gui/customizer/StringArrayPropertyEditor.java +++ b/src/antidote/org/apache/tools/ant/gui/customizer/StringArrayPropertyEditor.java @@ -65,14 +65,14 @@ import java.util.StringTokenizer; * @author Simeon Fitch */ public class StringArrayPropertyEditor extends AbstractPropertyEditor { - private JTextPane _widget = null; + private JTextField _widget = null; /** * Default ctor. * */ public StringArrayPropertyEditor() { - _widget = new JTextPane(); + _widget = new JTextField() ; _widget.setBorder( BorderFactory.createBevelBorder(BevelBorder.LOWERED)); _widget.addFocusListener(new FocusHandler(this)); @@ -130,7 +130,6 @@ public class StringArrayPropertyEditor extends AbstractPropertyEditor { } } _widget.setText(buf.toString()); - firePropertyChange(old, buf.toString()); } /** @@ -158,7 +157,6 @@ public class StringArrayPropertyEditor extends AbstractPropertyEditor { public void setAsText(String text) throws IllegalArgumentException { Object old = _widget.getText(); _widget.setText(text); - firePropertyChange(old, text); } /** diff --git a/src/antidote/org/apache/tools/ant/gui/customizer/StringPropertyEditor.java b/src/antidote/org/apache/tools/ant/gui/customizer/StringPropertyEditor.java index 29fcc1252..50af9495a 100644 --- a/src/antidote/org/apache/tools/ant/gui/customizer/StringPropertyEditor.java +++ b/src/antidote/org/apache/tools/ant/gui/customizer/StringPropertyEditor.java @@ -64,14 +64,20 @@ import javax.swing.border.BevelBorder; * @author Simeon Fitch */ public class StringPropertyEditor extends AbstractPropertyEditor { - private JTextPane _widget = null; + private JTextArea _widget = null; /** * Default ctor. * */ public StringPropertyEditor() { - _widget = new JTextPane(); + _widget = new JTextArea() { + public boolean isManagingFocus() { + return false; + } + }; + + _widget.setLineWrap(true); _widget.addFocusListener(new FocusHandler(this)); _widget.setBorder( BorderFactory.createBevelBorder(BevelBorder.LOWERED)); @@ -115,15 +121,18 @@ public class StringPropertyEditor extends AbstractPropertyEditor { public void setValue(Object value) { Object old = _widget.getText(); _widget.setText(String.valueOf(value)); - firePropertyChange(old, value); } /** - * @return The value of the property. Builtin types such as "int" will - * be wrapped as the corresponding object type such as "java.lang.Integer". - */ + * @return The value of the property. Builtin types + * such as "int" will be wrapped as the corresponding + * object type such as "java.lang.Integer". */ public Object getValue() { - return _widget.getText(); + String retval = _widget.getText(); + if(retval != null && retval.length() == 0) { + retval = null; + } + return retval; } /** @@ -136,7 +145,6 @@ public class StringPropertyEditor extends AbstractPropertyEditor { public void setAsText(String text) throws IllegalArgumentException { Object old = _widget.getText(); _widget.setText(text); - firePropertyChange(old, text); } /**