git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268206 13f79535-47bb-0310-9956-ffa450edef68master
@@ -1,3 +1,12 @@ | |||
2000-11-18 Simeon H.K. Fitch <simeon@fitch.net> | |||
* 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 <simeon@fitch.net> | |||
* org/apache/tools/ant/gui/customizer/StringPropertyEditor.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(); | |||
} | |||
@@ -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 { | |||
@@ -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. | |||
* | |||
@@ -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); | |||
} | |||
/** | |||
@@ -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); | |||
} | |||
/** | |||
@@ -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); | |||
} | |||
} | |||
} | |||
@@ -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); | |||
} | |||
/** | |||
@@ -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); | |||
} | |||
/** | |||