metasim 00/11/18 20:21:37 Modified: src/antidote/org/apache/tools/ant/gui PropertyEditor.java src/antidote/org/apache/tools/ant/gui/acs ACSElement.java src/antidote/org/apache/tools/ant/gui/customizer AbstractPropertyEditor.java DoublePropertyEditor.java IntegerPropertyEditor.java PropertiesPropertyEditor.java StringArrayPropertyEditor.java StringPropertyEditor.java Log: Added generic attribute editing capability for tasks. Revision Changes Path 1.9 +6 -3 jakarta-ant/src/antidote/org/apache/tools/ant/gui/PropertyEditor.java Index: PropertyEditor.java =================================================================== RCS file: /home/cvs/jakarta-ant/src/antidote/org/apache/tools/ant/gui/PropertyEditor.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- PropertyEditor.java 2000/11/16 22:38:38 1.8 +++ PropertyEditor.java 2000/11/19 04:21:35 1.9 @@ -63,11 +63,12 @@ import java.io.IOException; import java.awt.BorderLayout; import java.awt.Component; +import java.awt.Point; /** * Stub for a property editor. * - * @version $Revision: 1.8 $ + * @version $Revision: 1.9 $ * @author Simeon H.K. Fitch */ class PropertyEditor extends AntEditor { @@ -76,6 +77,8 @@ 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 @@ 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 @@ } } - validate(); + _container.revalidate(); } 1.5 +2 -2 jakarta-ant/src/antidote/org/apache/tools/ant/gui/acs/ACSElement.java Index: ACSElement.java =================================================================== RCS file: /home/cvs/jakarta-ant/src/antidote/org/apache/tools/ant/gui/acs/ACSElement.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- ACSElement.java 2000/11/14 19:48:06 1.4 +++ ACSElement.java 2000/11/19 04:21:35 1.5 @@ -62,7 +62,7 @@ * Abstract base class for all Ant Construction Set * elements. Depends on the JAXP XML library from Sun. * - * @version $Revision: 1.4 $ + * @version $Revision: 1.5 $ * @author Simeon Fitch */ public abstract class ACSElement extends ElementNode { /** Name of the 'xmlString' property. */ @@ -103,7 +103,7 @@ * @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 { 1.2 +4 -2 jakarta-ant/src/antidote/org/apache/tools/ant/gui/customizer/AbstractPropertyEditor.java Index: AbstractPropertyEditor.java =================================================================== RCS file: /home/cvs/jakarta-ant/src/antidote/org/apache/tools/ant/gui/customizer/AbstractPropertyEditor.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- AbstractPropertyEditor.java 2000/11/10 20:41:17 1.1 +++ AbstractPropertyEditor.java 2000/11/19 04:21:36 1.2 @@ -57,6 +57,7 @@ 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; @@ -64,15 +65,16 @@ /** * Abstract base class for the custom type property editors. * - * @version $Revision: 1.1 $ + * @version $Revision: 1.2 $ * @author Simeon Fitch */ 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. * 1.2 +1 -4 jakarta-ant/src/antidote/org/apache/tools/ant/gui/customizer/DoublePropertyEditor.java Index: DoublePropertyEditor.java =================================================================== RCS file: /home/cvs/jakarta-ant/src/antidote/org/apache/tools/ant/gui/customizer/DoublePropertyEditor.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- DoublePropertyEditor.java 2000/11/10 20:41:17 1.1 +++ DoublePropertyEditor.java 2000/11/19 04:21:36 1.2 @@ -59,7 +59,7 @@ /** * Custom property editor for editing double values. * - * @version $Revision: 1.1 $ + * @version $Revision: 1.2 $ * @author Simeon Fitch */ public class DoublePropertyEditor extends AbstractPropertyEditor { @@ -117,8 +117,6 @@ } _widget.setText(value.toString()); - - firePropertyChange(old, value); } /** @@ -155,7 +153,6 @@ } text = val.toString(); _widget.setText(text); - firePropertyChange(old, text); } /** 1.2 +1 -4 jakarta-ant/src/antidote/org/apache/tools/ant/gui/customizer/IntegerPropertyEditor.java Index: IntegerPropertyEditor.java =================================================================== RCS file: /home/cvs/jakarta-ant/src/antidote/org/apache/tools/ant/gui/customizer/IntegerPropertyEditor.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- IntegerPropertyEditor.java 2000/11/10 20:41:17 1.1 +++ IntegerPropertyEditor.java 2000/11/19 04:21:36 1.2 @@ -59,7 +59,7 @@ /** * Custom property editor for integer types. * - * @version $Revision: 1.1 $ + * @version $Revision: 1.2 $ * @author Simeon Fitch */ public class IntegerPropertyEditor extends AbstractPropertyEditor { @@ -117,8 +117,6 @@ } _widget.setText(value.toString()); - - firePropertyChange(old, value); } /** @@ -155,7 +153,6 @@ } text = val.toString(); _widget.setText(text); - firePropertyChange(old, text); } /** 1.2 +122 -28 jakarta-ant/src/antidote/org/apache/tools/ant/gui/customizer/PropertiesPropertyEditor.java Index: PropertiesPropertyEditor.java =================================================================== RCS file: /home/cvs/jakarta-ant/src/antidote/org/apache/tools/ant/gui/customizer/PropertiesPropertyEditor.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- PropertiesPropertyEditor.java 2000/11/17 22:39:03 1.1 +++ PropertiesPropertyEditor.java 2000/11/19 04:21:36 1.2 @@ -63,12 +63,19 @@ /** * Custom property editor for the Properties class. * - * @version $Revision: 1.1 $ + * @version $Revision: 1.2 $ * @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 @@ _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); } @@ -125,21 +132,22 @@ throw new IllegalArgumentException( 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 @@ } /** 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; + private List _keys = null; - public PropertiesTableModel(Properties props) { - _properties = props; - - 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); + } + } } 1.3 +3 -5 jakarta-ant/src/antidote/org/apache/tools/ant/gui/customizer/StringArrayPropertyEditor.java Index: StringArrayPropertyEditor.java =================================================================== RCS file: /home/cvs/jakarta-ant/src/antidote/org/apache/tools/ant/gui/customizer/StringArrayPropertyEditor.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- StringArrayPropertyEditor.java 2000/11/16 22:59:35 1.2 +++ StringArrayPropertyEditor.java 2000/11/19 04:21:36 1.3 @@ -61,18 +61,18 @@ /** * Custom property editor for String arrays. * - * @version $Revision: 1.2 $ + * @version $Revision: 1.3 $ * @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 @@ } } _widget.setText(buf.toString()); - firePropertyChange(old, buf.toString()); } /** @@ -158,7 +157,6 @@ public void setAsText(String text) throws IllegalArgumentException { Object old = _widget.getText(); _widget.setText(text); - firePropertyChange(old, text); } /** 1.3 +17 -9 jakarta-ant/src/antidote/org/apache/tools/ant/gui/customizer/StringPropertyEditor.java Index: StringPropertyEditor.java =================================================================== RCS file: /home/cvs/jakarta-ant/src/antidote/org/apache/tools/ant/gui/customizer/StringPropertyEditor.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- StringPropertyEditor.java 2000/11/16 22:59:35 1.2 +++ StringPropertyEditor.java 2000/11/19 04:21:36 1.3 @@ -60,18 +60,24 @@ /** * Custom property editor for string types. * - * @version $Revision: 1.2 $ + * @version $Revision: 1.3 $ * @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 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 void setAsText(String text) throws IllegalArgumentException { Object old = _widget.getText(); _widget.setText(text); - firePropertyChange(old, text); } /**