diff --git a/src/antidote/org/apache/tools/ant/gui/LabelFieldGBC.java b/src/antidote/org/apache/tools/ant/gui/LabelFieldGBC.java index c3cbca812..57649922c 100644 --- a/src/antidote/org/apache/tools/ant/gui/LabelFieldGBC.java +++ b/src/antidote/org/apache/tools/ant/gui/LabelFieldGBC.java @@ -92,7 +92,7 @@ public class LabelFieldGBC extends GridBagConstraints { // Set location to left side. gridx = 0; // Move it over to be as close to field as possible. - anchor = EAST; + anchor = NORTHEAST; // Don't take up any extra. weightx = 0.0; return this; diff --git a/src/antidote/org/apache/tools/ant/gui/ProjectProxy.java b/src/antidote/org/apache/tools/ant/gui/ProjectProxy.java index 2a88ef8e6..ee3bb3665 100644 --- a/src/antidote/org/apache/tools/ant/gui/ProjectProxy.java +++ b/src/antidote/org/apache/tools/ant/gui/ProjectProxy.java @@ -85,7 +85,7 @@ public class ProjectProxy { /** The current thread executing a build. */ private Thread _buildThread = null; /** The selection model for selected targets. */ - private TargetSelectionModel _selections = null; + private ElementSelectionModel _selections = null; /** * File loading ctor. @@ -104,7 +104,7 @@ public class ProjectProxy { */ private void loadProject() throws IOException { _project = ACSFactory.getInstance().load(_file); - _selections = new TargetSelectionModel(); + _selections = new ElementSelectionModel(); _selections.addTreeSelectionListener(new SelectionForwarder()); } @@ -169,7 +169,7 @@ public class ProjectProxy { * * @return Selection model. */ - public TreeSelectionModel getTreeSelectionModel() { + public ElementSelectionModel getTreeSelectionModel() { return _selections; } @@ -209,6 +209,10 @@ public class ProjectProxy { } } + /** + * Run the build. + * + */ public void run() { // Add the build listener for // dispatching BuildEvent objects to the @@ -255,8 +259,8 @@ public class ProjectProxy { /** Forwards selection events to the event bus. */ private class SelectionForwarder implements TreeSelectionListener { public void valueChanged(TreeSelectionEvent e) { - _context.getEventBus().postEvent(new TargetSelectionEvent( - _context, _selections.getSelectedTargets())); + _context.getEventBus().postEvent(new ElementSelectionEvent( + _context, _selections.getSelectedElements())); } } diff --git a/src/antidote/org/apache/tools/ant/gui/PropertyEditor.java b/src/antidote/org/apache/tools/ant/gui/PropertyEditor.java index 7a91005cb..b72d93c19 100644 --- a/src/antidote/org/apache/tools/ant/gui/PropertyEditor.java +++ b/src/antidote/org/apache/tools/ant/gui/PropertyEditor.java @@ -72,6 +72,8 @@ class PropertyEditor extends AntEditor { /** The property sheet. */ private DynamicCustomizer _customizer = null; + /** Container for the customizer. */ + private JPanel _container = null; /** * Standard ctor. @@ -82,23 +84,25 @@ class PropertyEditor extends AntEditor { super(context); context.getEventBus().addMember(EventBus.MONITORING, new Handler()); setLayout(new BorderLayout()); + _container = new JPanel(new BorderLayout()); + add(new JScrollPane(_container)); } /** - * Update the display for the current item. + * Update the display for the current items. * - * @param item Current item. + * @param items Current items to display. */ - private void updateDisplay(ACSElement item) { + private void updateDisplay(ACSElement[] items) { if(_customizer != null) { - remove(_customizer); + _container.remove(_customizer); _customizer = null; } - if(item != null) { - _customizer = new DynamicCustomizer(item.getClass(), true); - _customizer.setObject(item); - add(BorderLayout.CENTER, _customizer); + if(items != null) { + _customizer = new DynamicCustomizer(items[0].getClass()); + _customizer.setObject(items[0]); + _container.add(BorderLayout.CENTER, _customizer); } validate(); } @@ -124,9 +128,9 @@ class PropertyEditor extends AntEditor { * @param event Event to post. */ public void eventPosted(EventObject event) { - TargetSelectionEvent e = (TargetSelectionEvent) event; - ACSTargetElement[] targets = e.getSelectedTargets(); - updateDisplay(targets.length == 0 ? null : targets[0]); + ElementSelectionEvent e = (ElementSelectionEvent) event; + ACSElement[] elements = e.getSelectedElements(); + updateDisplay(elements); } } @@ -139,7 +143,7 @@ class PropertyEditor extends AntEditor { * @return True if event should be given to BusMember, false otherwise. */ public boolean accept(EventObject event) { - return event instanceof TargetSelectionEvent; + return event instanceof ElementSelectionEvent; } } } diff --git a/src/antidote/org/apache/tools/ant/gui/TargetSelectionModel.java b/src/antidote/org/apache/tools/ant/gui/TargetSelectionModel.java deleted file mode 100644 index 83a823685..000000000 --- a/src/antidote/org/apache/tools/ant/gui/TargetSelectionModel.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * The Apache Software License, Version 1.1 - * - * Copyright (c) 1999, 2000 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, if - * any, must include the following acknowlegement: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowlegement may appear in the software itself, - * if and wherever such third-party acknowlegements normally appear. - * - * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software - * Foundation" must not be used to endorse or promote products derived - * from this software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache" - * nor may "Apache" appear in their names without prior written - * permission of the Apache Group. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ -package org.apache.tools.ant.gui; -import org.apache.tools.ant.gui.acs.ACSTargetElement; - -import javax.swing.tree.DefaultTreeSelectionModel; -import javax.swing.tree.TreePath; -import java.util.*; - -/** - * Selection model for the currently selected targets. - * - * @version $Revision$ - * @author Simeon Fitch - */ -class TargetSelectionModel extends DefaultTreeSelectionModel { - /** - * Default ctor. - * - */ - public TargetSelectionModel() { - setSelectionMode(DISCONTIGUOUS_TREE_SELECTION); - } - - /** - * Convenience method for providing the set of currently selected - * targets. - * - * @return the currently selected targets. - */ - public ACSTargetElement[] getSelectedTargets() { - TreePath[] path = getSelectionPaths(); - List values = new LinkedList(); - for(int i = 0; path != null && i < path.length; i++) { - Object val = path[i].getLastPathComponent(); - if(val instanceof ACSTargetElement) { - values.add(val); - } - } - - ACSTargetElement[] retval = new ACSTargetElement[values.size()]; - values.toArray(retval); - return retval; - } -} 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 b563ebca9..c28e7358b 100644 --- a/src/antidote/org/apache/tools/ant/gui/acs/ACSElement.java +++ b/src/antidote/org/apache/tools/ant/gui/acs/ACSElement.java @@ -65,6 +65,8 @@ import java.beans.PropertyChangeSupport; * @version $Revision$ * @author Simeon Fitch */ public abstract class ACSElement extends ElementNode { + /** Name of the 'xmlString' property. */ + public static final String XML_STRING = "xmlString"; /** Event support. */ private PropertyChangeSupport _propSupport = null; @@ -74,7 +76,6 @@ public abstract class ACSElement extends ElementNode { * */ protected ACSElement() { - } /** @@ -86,6 +87,15 @@ public abstract class ACSElement extends ElementNode { return getTagName(); } + /** + * Get the XML representation of this. + * + * @return XML representation. + */ + public String getXMLString() { + return toString(); + } + /** * Add a change listener. * diff --git a/src/antidote/org/apache/tools/ant/gui/acs/ACSFactory.java b/src/antidote/org/apache/tools/ant/gui/acs/ACSFactory.java index 1f53028c4..64b7228ae 100644 --- a/src/antidote/org/apache/tools/ant/gui/acs/ACSFactory.java +++ b/src/antidote/org/apache/tools/ant/gui/acs/ACSFactory.java @@ -62,6 +62,7 @@ import com.sun.xml.tree.SimpleElementFactory; import com.sun.xml.tree.XmlDocument; import com.sun.xml.tree.XmlDocumentBuilder; import java.util.Properties; +import java.util.Enumeration; import com.sun.xml.parser.Resolver; /** @@ -79,10 +80,25 @@ public class ACSFactory { static { try { + // First we bootstrap our knowledge of the Ant tasks by reading + // in the taskdef definitions and assigning them the default + // task element class. + _elementMap.load(org.apache.tools.ant.taskdefs.Ant.class. + getResourceAsStream("defaults.properties")); + Enumeration enum = _elementMap.propertyNames(); + while(enum.hasMoreElements()) { + String name = (String) enum.nextElement(); + // XXX the name of the class needs to be stored externally. + _elementMap.setProperty( + name, "org.apache.tools.ant.gui.acs.ACSTaskElement"); + } + + // Then we add/override the local definitions. _elementMap.load(ACSFactory.class. getResourceAsStream("acs-element.properties")); } catch(Throwable ex) { + // If something wrong happens here we can't do much more... ex.printStackTrace(); System.exit(1); } diff --git a/src/antidote/org/apache/tools/ant/gui/acs/ACSProjectElement.java b/src/antidote/org/apache/tools/ant/gui/acs/ACSProjectElement.java index 7a3c37b6b..31b93b2e7 100644 --- a/src/antidote/org/apache/tools/ant/gui/acs/ACSProjectElement.java +++ b/src/antidote/org/apache/tools/ant/gui/acs/ACSProjectElement.java @@ -62,8 +62,17 @@ import com.sun.xml.tree.ElementNode; * @author Simeon Fitch */ public class ACSProjectElement extends ACSNamedElement { - public ACSProjectElement() { + /** The 'default' property name. */ + public static final String DEFAULT = "default"; + /** The 'basdir' property name. */ + public static final String BASEDIR = "basedir"; + + /** + * Default ctor. + * + */ + public ACSProjectElement() { } /** @@ -83,4 +92,45 @@ public class ACSProjectElement extends ACSNamedElement { public String getDisplayName() { return getTagName() + ": " + getName(); } + + /** + * Get the name of the default target. + * + * @return Default target name. + */ + public String getDefault() { + return getAttribute(DEFAULT); + } + + /** + * Set the name of the default target. + * + * @param def Name of the default target. + */ + public void setDefault(String def) { + String old = getDefault(); + setAttribute(DEFAULT, def); + firePropertyChange(DEFAULT, old, def); + } + + /** + * Get the specified base directory for the build. + * + * @return Base directory + */ + public String getBasedir() { + return getAttribute(BASEDIR); + } + + /** + * Set the base directory for builds. + * + * @param baseDir Build base directory. + */ + public void setBasedir(String baseDir) { + String old = getBasedir(); + setAttribute(BASEDIR, baseDir); + firePropertyChange(BASEDIR, old, baseDir); + } + } diff --git a/src/antidote/org/apache/tools/ant/gui/acs/ACSProjectElementBeanInfo.java b/src/antidote/org/apache/tools/ant/gui/acs/ACSProjectElementBeanInfo.java index 43515ec1a..95b38cf5f 100644 --- a/src/antidote/org/apache/tools/ant/gui/acs/ACSProjectElementBeanInfo.java +++ b/src/antidote/org/apache/tools/ant/gui/acs/ACSProjectElementBeanInfo.java @@ -56,7 +56,7 @@ package org.apache.tools.ant.gui.acs; import java.beans.*; /** - * BeanInfo for the ACSTargetElement class. + * BeanInfo for the ACSProjectElement class. * * @version $Revision$ * @author Simeon Fitch @@ -91,9 +91,23 @@ public class ACSProjectElementBeanInfo extends BaseBeanInfo { new PropertyDescriptor(ACSProjectElement.NAME, ACSProjectElement.class), new PropertyDescriptor(ACSProjectElement.DESCRIPTION, + ACSProjectElement.class), + new PropertyDescriptor(ACSProjectElement.DEFAULT, + ACSProjectElement.class), + new PropertyDescriptor(ACSProjectElement.BASEDIR, ACSProjectElement.class) }; + retval[0].setDisplayName(getResources().getString( + getClass(),ACSProjectElement.NAME)); + retval[1].setDisplayName(getResources().getString( + getClass(),ACSProjectElement.DESCRIPTION)); + retval[2].setDisplayName(getResources().getString( + getClass(),ACSProjectElement.DEFAULT)); + retval[3].setDisplayName(getResources().getString( + getClass(),ACSProjectElement.BASEDIR)); + + setSortingOrder(retval); } catch(IntrospectionException ex) { ex.printStackTrace(); diff --git a/src/antidote/org/apache/tools/ant/gui/acs/ACSTargetElement.java b/src/antidote/org/apache/tools/ant/gui/acs/ACSTargetElement.java index c0cc21856..32148c164 100644 --- a/src/antidote/org/apache/tools/ant/gui/acs/ACSTargetElement.java +++ b/src/antidote/org/apache/tools/ant/gui/acs/ACSTargetElement.java @@ -64,6 +64,13 @@ import java.util.StringTokenizer; */ public class ACSTargetElement extends ACSNamedElement { + /** Dependency property name. */ + public static final String DEPENDS = "depends"; + /** 'if' clause property name. */ + public static final String IF = "if"; + /** 'unless' clause property name. */ + public static final String UNLESS = "unless"; + /** * Default ctor. * @@ -73,29 +80,85 @@ public class ACSTargetElement extends ACSNamedElement { } /** - * Set the set of dependency names. + * Get the display name. + * + * @return Display name. + */ + public String getDisplayName() { + return getTagName() + ": " + getName(); + } + + /** + * Get the set of dependency names. * * @return Dependency names. */ - public String[] getDependencyNames() { - String depends = getAttribute("depends"); + public String[] getDepends() { + String depends = getAttribute(DEPENDS); StringTokenizer tok = new StringTokenizer(depends,","); String[] retval = new String[tok.countTokens()]; for(int i = 0; i < retval.length; i++) { - retval[i] = tok.nextToken(); + retval[i] = tok.nextToken().trim(); } return retval; } /** - * Get the display name. + * Set the list of dependency names. * - * @return Display name. + * @param depends Dependency names. */ - public String getDisplayName() { - return getTagName() + ": " + getName(); + public void setDepends(String[] depends) { + String old = getAttribute(DEPENDS); + StringBuffer buf = new StringBuffer(); + for(int i = 0; depends != null && i < depends.length; i++) { + buf.append(depends[i]); + if(i < depends.length - 1) { + buf.append(", "); + } + } + setAttribute(DEPENDS, buf.toString()); + firePropertyChange(DEPENDS, old, buf.toString()); + } + + /** + * Get the 'if' clause. + * + * @return 'if' clause. + */ + public String getIf() { + return getAttribute(IF); + } + + /** + * Set the 'if' clause. + * + * @param val 'if' clause value. + */ + public void setIf(String val) { + String old = getIf(); + setAttribute(IF, val); + firePropertyChange(IF, old, val); } + /** + * Get the 'unless' clause. + * + * @return 'unless' clause. + */ + public String getUnless() { + return getAttribute(UNLESS); + } + /** + * Set the 'unless' clause. + * + * @param val 'unless' clase value. + */ + public void setUnless(String val) { + String old = getUnless(); + setAttribute(UNLESS, val); + firePropertyChange(UNLESS, old, val); + } } diff --git a/src/antidote/org/apache/tools/ant/gui/acs/ACSTargetElementBeanInfo.java b/src/antidote/org/apache/tools/ant/gui/acs/ACSTargetElementBeanInfo.java index 68d9653c3..92b2a70c9 100644 --- a/src/antidote/org/apache/tools/ant/gui/acs/ACSTargetElementBeanInfo.java +++ b/src/antidote/org/apache/tools/ant/gui/acs/ACSTargetElementBeanInfo.java @@ -88,14 +88,36 @@ public class ACSTargetElementBeanInfo extends BaseBeanInfo { try { retval = new PropertyDescriptor[] { - new PropertyDescriptor(getResources().getString( - getClass(),ACSTargetElement.NAME), + new PropertyDescriptor(ACSTargetElement.NAME, ACSTargetElement.class), - new PropertyDescriptor(getResources().getString( - getClass(),ACSTargetElement.DESCRIPTION), - ACSTargetElement.class) - + new PropertyDescriptor(ACSTargetElement.DESCRIPTION, + ACSTargetElement.class), + new PropertyDescriptor(ACSTargetElement.DEPENDS, + ACSTargetElement.class), + new PropertyDescriptor(ACSTargetElement.IF, + ACSTargetElement.class), + new PropertyDescriptor(ACSTargetElement.UNLESS, + ACSTargetElement.class), + new PropertyDescriptor(ACSTargetElement.XML_STRING, + ACSTargetElement.class, + "getXMLString", null) }; + + // Set display names. + retval[0].setDisplayName(getResources().getString( + getClass(),ACSTargetElement.NAME)); + retval[1].setDisplayName(getResources().getString( + getClass(),ACSTargetElement.DESCRIPTION)); + retval[2].setDisplayName(getResources().getString( + getClass(),ACSTargetElement.DEPENDS)); + retval[3].setDisplayName(getResources().getString( + getClass(),ACSTargetElement.IF)); + retval[4].setDisplayName(getResources().getString( + getClass(),ACSTargetElement.UNLESS)); + retval[5].setDisplayName(getResources().getString( + getClass(),ACSTargetElement.XML_STRING)); + + setSortingOrder(retval); } catch(IntrospectionException ex) { ex.printStackTrace(); diff --git a/src/antidote/org/apache/tools/ant/gui/acs/BaseBeanInfo.java b/src/antidote/org/apache/tools/ant/gui/acs/BaseBeanInfo.java index c8ac38fa9..10954ec95 100644 --- a/src/antidote/org/apache/tools/ant/gui/acs/BaseBeanInfo.java +++ b/src/antidote/org/apache/tools/ant/gui/acs/BaseBeanInfo.java @@ -54,6 +54,7 @@ package org.apache.tools.ant.gui.acs; import org.apache.tools.ant.gui.ResourceManager; +import org.apache.tools.ant.gui.customizer.DynamicCustomizer; import java.beans.*; /** @@ -63,10 +64,11 @@ import java.beans.*; * @author Simeon Fitch */ abstract class BaseBeanInfo extends SimpleBeanInfo { + /** Property name for specifiying a sorting order. */ + public static final String SORT_ORDER = DynamicCustomizer.SORT_ORDER; /** Resource provider for bean info. */ - private static ResourceManager _resources = new ResourceManager( - "org.apache.tools.ant.gui.acs.beaninfo"); + private static ResourceManager _resources = new ResourceManager(); /** * Default ctor. @@ -93,6 +95,18 @@ abstract class BaseBeanInfo extends SimpleBeanInfo { return new ACSBeanDescriptor(this); } + /** + * Set the sorting order property of the given objects based + * on the order that they appear in the array. + * + * @param vals FeatureDescriptors to set sorting order property for. + */ + protected void setSortingOrder(FeatureDescriptor[] vals) { + for(int i = 0; i < vals.length; i++) { + vals[i].setValue(SORT_ORDER, new Integer(i)); + } + } + /** * Get the type that this BeanInfo represents. * diff --git a/src/antidote/org/apache/tools/ant/gui/acs/acs-element.properties b/src/antidote/org/apache/tools/ant/gui/acs/acs-element.properties index f4306bc99..7f539ef11 100644 --- a/src/antidote/org/apache/tools/ant/gui/acs/acs-element.properties +++ b/src/antidote/org/apache/tools/ant/gui/acs/acs-element.properties @@ -7,4 +7,5 @@ # Specific elements. project=org.apache.tools.ant.gui.acs.ACSProjectElement +property=org.apache.tools.ant.gui.acs.ACSPropertyElement target=org.apache.tools.ant.gui.acs.ACSTargetElement diff --git a/src/antidote/org/apache/tools/ant/gui/acs/beaninfo.properties b/src/antidote/org/apache/tools/ant/gui/acs/beaninfo.properties deleted file mode 100644 index d949388b0..000000000 --- a/src/antidote/org/apache/tools/ant/gui/acs/beaninfo.properties +++ /dev/null @@ -1,14 +0,0 @@ -# Properties file for BeanInfo strings - -org.apache.tools.ant.gui.acs.ACSTargetElementBeanInfo.beanName=Target -org.apache.tools.ant.gui.acs.ACSTargetElementBeanInfo.beanDescription=\ - An executable target in the build. -org.apache.tools.ant.gui.acs.ACSTargetElementBeanInfo.name=Name -org.apache.tools.ant.gui.acs.ACSTargetElementBeanInfo.description=Description - -org.apache.tools.ant.gui.acs.ACSProjectElementBeanInfo.beanName=Project -org.apache.tools.ant.gui.acs.ACSProjectElementBeanInfo.beanDescription=\ - The top level project in the build definition. -org.apache.tools.ant.gui.acs.ACSProjectElementBeanInfo.name=Name -org.apache.tools.ant.gui.acs.ACSProjectElementBeanInfo.description=Description - diff --git a/src/antidote/org/apache/tools/ant/gui/customizer/DynamicCustomizer.java b/src/antidote/org/apache/tools/ant/gui/customizer/DynamicCustomizer.java index 51c94ad22..8e5aa8ca0 100644 --- a/src/antidote/org/apache/tools/ant/gui/customizer/DynamicCustomizer.java +++ b/src/antidote/org/apache/tools/ant/gui/customizer/DynamicCustomizer.java @@ -57,8 +57,7 @@ import org.apache.tools.ant.gui.LabelFieldGBC; import java.lang.reflect.*; import java.beans.*; import javax.swing.*; -import java.util.Hashtable; -import java.util.Enumeration; +import java.util.*; import java.awt.GridBagLayout; import java.awt.GridBagConstraints; import java.awt.Component; @@ -74,6 +73,8 @@ public class DynamicCustomizer extends JPanel { static { PropertyEditorManager.registerEditor( String.class, StringPropertyEditor.class); + PropertyEditorManager.registerEditor( + String[].class, StringArrayPropertyEditor.class); PropertyEditorManager.registerEditor( int.class, IntegerPropertyEditor.class); PropertyEditorManager.registerEditor( @@ -84,14 +85,19 @@ public class DynamicCustomizer extends JPanel { Double.class, DoublePropertyEditor.class); } + /** Property name that PropertyDescriptors can save in their property + * dictionaries for for specifiying a display sorting order. The value + * sould be of type Integer. */ + public static final String SORT_ORDER = "sortOrder"; + /** The type that this editor instance can handle. */ private Class _type = null; /** The value currently being edited. */ private Object _value = null; /** Mapping from PropertyDescriptor to PropertyEditor. */ - private Hashtable _prop2Editor = new Hashtable(); + private Map _prop2Editor = new HashMap(); /** Mapping from PropertyEditor to field PropertyDescriptor. */ - private Hashtable _editor2Prop = new Hashtable(); + private Map _editor2Prop = new HashMap(); /** Listener for receiving change events from the editors. */ private EditorChangeListener _eListener = new EditorChangeListener(); /** Read-only flag. */ @@ -121,11 +127,18 @@ public class DynamicCustomizer extends JPanel { LabelFieldGBC gbc = new LabelFieldGBC(); try { BeanInfo info = Introspector.getBeanInfo(type); + // Set up pretty display stuff. setBorder(BorderFactory.createTitledBorder( info.getBeanDescriptor().getDisplayName())); + setToolTipText(info.getBeanDescriptor().getShortDescription()); + + // Get the properties and sort them. PropertyDescriptor[] props = info.getPropertyDescriptors(); + Arrays.sort(props, new PropertyComparator()); for(int i = 0; i < props.length; i++) { + // Ignore the "class" property, if it is provided. if(props[i].getName().equals("class")) continue; + // Create a label for the field. JLabel label = new JLabel(props[i].getDisplayName() + ":"); // Lookup the editor. @@ -195,9 +208,9 @@ public class DynamicCustomizer extends JPanel { // Iterate over each property, doing a lookup on the associated editor // and setting the editor's value to the value of the property. - Enumeration enum = _prop2Editor.keys(); - while(enum.hasMoreElements()) { - PropertyDescriptor desc = (PropertyDescriptor) enum.nextElement(); + Iterator it = _prop2Editor.keySet().iterator(); + while(it.hasNext()) { + PropertyDescriptor desc = (PropertyDescriptor) it.next(); PropertyEditor editor = (PropertyEditor) _prop2Editor.get(desc); Method reader = desc.getReadMethod(); if(reader != null) { @@ -215,6 +228,12 @@ public class DynamicCustomizer extends JPanel { } } + /** + * Get the appropriate editor for the given property. + * + * @param prop Property to get editor for. + * @return Editor to use, or null if none found. + */ private PropertyEditor getEditorForProperty(PropertyDescriptor prop) { PropertyEditor retval = null; Class type = prop.getPropertyEditorClass(); @@ -231,7 +250,10 @@ public class DynamicCustomizer extends JPanel { // PropertyEditor manager for the editor registered for the // given property type. if(retval == null) { - retval = PropertyEditorManager.findEditor(prop.getPropertyType()); + Class t = prop.getPropertyType(); + if(t != null) { + retval = PropertyEditorManager.findEditor(t); + } } return retval; @@ -262,6 +284,27 @@ public class DynamicCustomizer extends JPanel { } + /** Comparator for sorting PropertyDescriptor values. */ + private static class PropertyComparator implements Comparator { + public int compare(Object o1, Object o2) { + PropertyDescriptor p1 = (PropertyDescriptor)o1; + PropertyDescriptor p2 = (PropertyDescriptor)o2; + + Integer i1 = (Integer) p1.getValue(SORT_ORDER); + Integer i2 = (Integer) p2.getValue(SORT_ORDER); + + if(i1 == null && i2 == null) { + return 0; + } + else if(i1 != null) { + return i1.compareTo(i2); + } + else { + return i2.compareTo(i1) * -1; + } + } + } + /** * Test code. * diff --git a/src/antidote/org/apache/tools/ant/gui/event/TargetSelectionEvent.java b/src/antidote/org/apache/tools/ant/gui/event/TargetSelectionEvent.java deleted file mode 100644 index 573cfc0ce..000000000 --- a/src/antidote/org/apache/tools/ant/gui/event/TargetSelectionEvent.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * The Apache Software License, Version 1.1 - * - * Copyright (c) 1999, 2000 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, if - * any, must include the following acknowlegement: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowlegement may appear in the software itself, - * if and wherever such third-party acknowlegements normally appear. - * - * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software - * Foundation" must not be used to endorse or promote products derived - * from this software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache" - * nor may "Apache" appear in their names without prior written - * permission of the Apache Group. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ -package org.apache.tools.ant.gui.event; -import org.apache.tools.ant.gui.acs.ACSTargetElement; -import org.apache.tools.ant.gui.command.Command; -import org.apache.tools.ant.gui.command.NoOpCmd; -import org.apache.tools.ant.gui.AppContext; - -/** - * Event indicating that the current set of selected targets has changed. - * - * @version $Revision$ - * @author Simeon Fitch - */ -public class TargetSelectionEvent extends AntEvent { - - /** New set of selected targets. */ - private ACSTargetElement[] _selectedTargets = null; - - /** - * Standard ctor. - * - * @param context application context. - */ - public TargetSelectionEvent(AppContext context, - ACSTargetElement[] selectedTargets) { - super(context); - _selectedTargets = selectedTargets; - } - - /** - * Current set of selected targets. - * - * @return selected target set. - */ - public ACSTargetElement[] getSelectedTargets() { - return _selectedTargets; - } - - /** - * Create the appropriate default response command to this event. - * - * @return Command representing an appropriate response to this event. - */ - public Command createDefaultCmd() { - return new NoOpCmd(); - } -}