diff --git a/src/antidote/build.xml b/src/antidote/build.xml
index 2104bcf08..52e0671ad 100644
--- a/src/antidote/build.xml
+++ b/src/antidote/build.xml
@@ -70,6 +70,7 @@
+
diff --git a/src/antidote/org/apache/tools/ant/gui/acs/ACSDocumentType.java b/src/antidote/org/apache/tools/ant/gui/acs/ACSDocumentType.java
new file mode 100644
index 000000000..9854054df
--- /dev/null
+++ b/src/antidote/org/apache/tools/ant/gui/acs/ACSDocumentType.java
@@ -0,0 +1,390 @@
+/*
+ * 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", "Ant", 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.acs;
+import java.io.*;
+import java.net.*;
+import java.util.*;
+import org.w3c.dom.*;
+import javax.xml.parsers.*;
+import org.xml.sax.SAXException;
+import org.xml.sax.InputSource;
+import com.sun.xml.parser.Parser;
+import com.sun.xml.parser.DtdEventListener;
+import com.sun.xml.parser.ValidatingParser;
+import com.sun.xml.tree.*;
+import com.sun.xml.parser.Resolver;
+
+/**
+ * Reads the ANT DTD and provides information about it.
+ *
+ * @version $Revision$
+ * @author Nick Davisnick_home_account@yahoo.com
+ */
+public class ACSDocumentType extends java.lang.Object {
+ /** True if the DTD has been loaded */
+ private boolean isInit = false;
+ /** Hold the DTD elements */
+ private HashMap elementMap = new HashMap();
+ /** XML document used to load the DTD */
+ final static String XMLDOC =
+ "" +
+ "" +
+ "" +
+ "";
+
+ /**
+ * Standard ctor.
+ */
+ public ACSDocumentType() {
+ }
+
+ /**
+ * Loads the DTD if not already loaded.
+ */
+ public void init() {
+ // Return if already inited.
+ if (isInit) {
+ return;
+ }
+
+ try {
+ // Setup the parser
+ Parser p = new Parser();
+ p.setEntityResolver(new ACSResolver());
+
+ // Setup the builder
+ XmlDocumentBuilder builder = new XmlDocumentBuilder();
+ SimpleElementFactory fact = new SimpleElementFactory();
+ fact.addMapping(new Properties(),
+ ACSDocumentType.class.getClassLoader());
+ builder.setElementFactory(fact);
+ builder.setParser(p);
+
+ DtdHandler dtdh = new DtdHandler();
+ p.setDTDHandler(dtdh);
+
+ // Create the default xml file
+ InputSource xmldoc = new InputSource(
+ new ByteArrayInputStream(XMLDOC.getBytes()));
+
+ // Parse the document
+ p.parse(xmldoc);
+
+ isInit = true;
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ }
+
+ /**
+ * Returns the dtd element.
+ *
+ * @param name the element name
+ */
+ public DtdElement findElement(String name) {
+ return (DtdElement) elementMap.get(name);
+ }
+
+ /**
+ * Class which represents a DTD element.
+ */
+ static class DtdElement {
+ private String _name;
+ private String[] _contentModel;
+ private HashMap _map = new HashMap();
+
+ public String getName() {
+ return _name;
+ }
+ public void setName(String name) {
+ _name = name;
+ }
+ public String[] getContentModel() {
+ return _contentModel;
+ }
+ public void setContentModel(String[] model) {
+ _contentModel = model;
+ }
+ public HashMap getMap() {
+ return _map;
+ }
+ }
+
+ /**
+ * Class which represents a DTD attribute.
+ */
+ static class DtdAttribute {
+ private String _name;
+ private String _type;
+ private String[] _options;
+ private String _defaultValue;
+ private boolean _isFixed;
+ private boolean _isRequired;
+
+ public String getName() {
+ return _name;
+ }
+ public void setName(String name) {
+ _name = _name;
+ }
+ public String getType() {
+ return _type;
+ }
+ public void setType(String type) {
+ _name = type;
+ }
+ public String getDefaultValue() {
+ return _defaultValue;
+ }
+ public void setDefaultValue(String value) {
+ _defaultValue = value;
+ }
+ public String[] getOptions() {
+ return _options;
+ }
+ public void setOptions(String[] s) {
+ _options = s;
+ }
+ public boolean isFixed() {
+ return _isFixed;
+ }
+ public void setFixed(boolean value) {
+ _isFixed = value;
+ }
+ public boolean isRequired() {
+ return _isRequired;
+ }
+ public void setRequired(boolean value) {
+ _isRequired = value;
+ }
+ }
+
+ /**
+ * When parsing XML documents, DTD related events are signaled through
+ * this interface.
+ */
+ class DtdHandler implements DtdEventListener {
+ public void externalDtdDecl (
+ String publicId,
+ String systemId)
+ throws SAXException { }
+
+ public void internalDtdDecl (
+ String internalSubset)
+ throws SAXException { }
+
+ public void internalEntityDecl (
+ String name,
+ String value)
+ throws SAXException { }
+
+ public void externalEntityDecl (
+ String name,
+ String publicId,
+ String systemId)
+ throws SAXException { }
+
+ public void endDtd ()
+ throws SAXException { }
+
+ public void notationDecl (
+ String name,
+ String publicId,
+ String systemId)
+ throws SAXException { }
+
+ public void unparsedEntityDecl (
+ String name,
+ String publicId,
+ String systemId,
+ String notationName)
+ throws SAXException { }
+
+ public void startDtd (
+ String rootName
+ ) throws SAXException
+ {
+ elementMap.clear();
+ }
+
+ /**
+ * Reports an attribute declaration found within the DTD.
+ *
+ * @param elementName The name of the element to which the attribute
+ * applies; this includes a namespace prefix if one was used within
+ * the DTD.
+ * @param attributeName The name of the attribute being declared; this
+ * includes a namespace prefix if one was used within the DTD.
+ * @param attributeType The type of the attribute, either CDATA, NMTOKEN,
+ * NMTOKENS, ENTITY, ENTITIES, NOTATION, ID, IDREF, or IDREFS as
+ * defined in the XML specification; or null for enumerations.
+ * @param options When attributeType is null or NOTATION, this is an
+ * array of the values which are permitted; it is otherwise null.
+ * @param defaultValue When not null, this provides the default value
+ * of this attribute.
+ * @param isFixed When true, the defaultValue is the only legal value.
+ * (Precludes isRequired.)
+ * @param isRequired When true, the attribute value must be provided
+ * for each element of the named type. (Precludes isFixed.)
+ */
+ public void attributeDecl (
+ String elementName,
+ String attributeName,
+ String attributeType,
+ String options [],
+ String defaultValue,
+ boolean isFixed,
+ boolean isRequired
+ ) throws SAXException
+ {
+ // Try to find the element.
+ DtdElement e = (DtdElement) elementMap.get(elementName);
+ if (e == null) {
+ throw new SAXException("element " + elementName +
+ " not declared before attributes");
+ }
+
+ // Update the element's attribute.
+ DtdAttribute attrib = new DtdAttribute();
+ attrib.setName(attributeName);
+ attrib.setType(attributeType);
+ attrib.setFixed(isFixed);
+ attrib.setRequired(isRequired);
+ attrib.setDefaultValue(defaultValue);
+ attrib.setOptions(options);
+ e.getMap().put(attrib.getName(), e);
+ }
+
+ /**
+ * Reports an element declaration found within the DTD. The content
+ * model will be a string such as "ANY", "EMPTY", "(#PCDATA|foo)*",
+ * or "(caption?,tr*)".
+ *
+ * @param elementName The name of the element; this includes a namespace
+ * prefix if one was used within the DTD.
+ * @param contentModel The content model as defined in the DTD, with
+ * any whitespace removed.
+ */
+ public void elementDecl (
+ String elementName,
+ String contentModel
+ ) throws SAXException
+ {
+ DtdElement e = new DtdElement();
+ e.setName(elementName);
+
+ // Break the contentModel string into pieces.
+ ArrayList list = new ArrayList();
+ StringTokenizer st = new StringTokenizer(contentModel, "|()*");
+ while (st.hasMoreTokens()) {
+ String s = st.nextToken();
+ if ( s.length() > 0 && !"EMPTY".equals(s) ) {
+ list.add(s);
+ }
+ }
+ String[] array = new String[list.size()];
+ list.toArray(array);
+ e.setContentModel(array);
+
+ // Update the map
+ elementMap.put(e.getName(), e);
+ }
+ }
+
+ /**
+ * We provide the location for the ant dtds.
+ */
+ class ACSResolver implements org.xml.sax.EntityResolver {
+
+ /**
+ * We process the project.dtd and project-ext.dtd.
+ *
+ * @param name Used to find alternate copies of the entity, when
+ * this value is non-null; this is the XML "public ID".
+ * @param uri Used when no alternate copy of the entity is found;
+ * this is the XML "system ID", normally a URI.
+ */
+ public InputSource resolveEntity (
+ String publicId,
+ String systemId)
+ throws SAXException, IOException {
+
+ final String PROJECT = "project.dtd";
+ final String PROJECTEXT = "project-ext.dtd";
+ InputStream result = null;
+
+ // Is it the project.dtd?
+ if (systemId.indexOf(PROJECT) != -1) {
+ try {
+ // Look for it as a resource
+ result = getClass().getResourceAsStream(PROJECT);
+ } catch (Exception e) {}
+ }
+ // Is it the project-ext.dtd?
+ if (systemId.indexOf(PROJECTEXT) != -1) {
+ try {
+ // Look for it as a resource
+ result = getClass().getResourceAsStream(PROJECTEXT);
+ } catch (Exception e) {}
+ }
+ if (result != null) {
+ return new InputSource(result);
+ }
+
+ // Otherwise, use the default impl.
+ com.sun.xml.parser.Resolver r = new com.sun.xml.parser.Resolver();
+ return r.resolveEntity(publicId, systemId);
+ }
+ }
+}
diff --git a/src/antidote/org/apache/tools/ant/gui/acs/ACSDtdDefinedElement.java b/src/antidote/org/apache/tools/ant/gui/acs/ACSDtdDefinedElement.java
new file mode 100644
index 000000000..7835501b3
--- /dev/null
+++ b/src/antidote/org/apache/tools/ant/gui/acs/ACSDtdDefinedElement.java
@@ -0,0 +1,215 @@
+/*
+ * 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", "Ant", 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.acs;
+import org.apache.tools.ant.gui.command.NewElementCmd;
+import org.w3c.dom.*;
+import java.beans.*;
+import java.util.*;
+
+/**
+ * Element defined by the DTD.
+ *
+ * @version $Revision$
+ * @author Nick Davisnick_home_account@yahoo.com
+ */
+public class ACSDtdDefinedElement extends ACSTreeNodeElement
+implements ACSInfoProvider {
+
+ /** Property name for the task type. */
+ public static final String TASK_TYPE = "taskType";
+ /** Property name for attributes. It's called "namedValues" so
+ * it doesn't collide with the Node.getAttributes() method. */
+ public static final String NAMED_VALUES = "namedValues";
+ /** The ANT DTD */
+ static ACSDocumentType docType = new ACSDocumentType();
+ /** Our menu string */
+ public String[] menuString = null;
+
+ /**
+ * Default ctor.
+ *
+ */
+ public ACSDtdDefinedElement() {
+ // Load the DTD
+ docType.init();
+ }
+
+ /**
+ * Get the task type.
+ *
+ * @return Task type.
+ */
+ public String getTaskType() {
+ return getTagName();
+ }
+
+ /**
+ * Set the task type.
+ *
+ * @param type Type name.
+ */
+ public void setTaskType(String type) {
+ setTag(type);
+ }
+
+ /**
+ * Get the attributes (named value mappings). This method is not named
+ * getAttributes() because there is already a method of that name in
+ * the Node interface.
+ *
+ * @return Name-value mappings.
+ */
+ public Properties getNamedValues() {
+ Properties retval = new Properties();
+
+ NamedNodeMap attribs = getAttributes();
+ for(int i = 0, len = attribs.getLength(); i < len; i++) {
+ Node n = attribs.item(i);
+ retval.setProperty(n.getNodeName(), n.getNodeValue());
+ }
+ return retval;
+ }
+
+
+ /**
+ * Set the attributes. This method sets the Node attirbutes using
+ * the given Map containing name-value pairs.
+ *
+ * @param attributes New attribute set.
+ */
+ public void setNamedValues(Properties props) {
+ // XXX this code really sucks. It is really annoying that the
+ // DOM interfaces don't have a general "setAttributes()" or
+ // "removeAllAttributes()" method, but instead make you
+ // remove each attribute individually, or require you to figure
+ // out what the differences are between the two.
+
+ // Although this is very inefficient, I'm taking the conceptually
+ // simplistic approach to this and brute force removing the existing
+ // set and replacing it with a brand new set. If this becomes a
+ // performance concern (which I doubt it will) it can be optimized
+ // later.
+
+ Properties old = getNamedValues();
+
+ Enumeration enum = old.propertyNames();
+ while(enum.hasMoreElements()) {
+ String name = (String) enum.nextElement();
+ removeAttribute(name);
+ }
+
+ enum = props.propertyNames();
+ while(enum.hasMoreElements()) {
+ String key = (String) enum.nextElement();
+ setAttribute(key, props.getProperty(key));
+ }
+
+ firePropertyChange(NAMED_VALUES, old, props);
+ }
+
+ /**
+ * Returns the menu items which may be used for this element.
+ */
+ public String[] getMenuString() {
+
+ // If it already exists, use it.
+ if (menuString != null) {
+ return menuString;
+ }
+
+ // Find the DtdElement
+ String name = getTagName();
+ ACSDocumentType.DtdElement e =
+ docType.findElement(name);
+
+ if (e != null) {
+ // Use the content model (all the possible
+ // sub-elements) to create the menu.
+ String[] temp = e.getContentModel();
+ int size = (temp.length > 5) ? 5 : temp.length;
+ menuString = new String[size+2];
+ System.arraycopy(temp, 0, menuString, 0, size);
+
+ // Add the delete and generic create commands
+ menuString[menuString.length-1] = "deleteElement";
+ menuString[menuString.length-2] = "newElement";
+ }
+ return menuString;
+ }
+
+ /**
+ * Returns the string to use if an action ID is not found.
+ * In our case, the newElement command is used.
+ */
+ public String getDefaultActionID() {
+ return "newElement";
+ }
+
+ /**
+ * Retuns a string array which contains this elements
+ * possible children. It is created from the DTD's
+ * content model.
+ */
+ public String[] getPossibleChildren() {
+ String name = getTagName();
+ ACSDocumentType.DtdElement e =
+ docType.findElement(name);
+
+ if (e != null) {
+ return e.getContentModel();
+ }
+ return null;
+ }
+}
+
diff --git a/src/antidote/org/apache/tools/ant/gui/acs/ACSDtdDefinedElementBeanInfo.java b/src/antidote/org/apache/tools/ant/gui/acs/ACSDtdDefinedElementBeanInfo.java
new file mode 100644
index 000000000..68899e20b
--- /dev/null
+++ b/src/antidote/org/apache/tools/ant/gui/acs/ACSDtdDefinedElementBeanInfo.java
@@ -0,0 +1,133 @@
+/*
+ * 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", "Ant", 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.acs;
+import org.apache.tools.ant.gui.customizer.DynamicCustomizer;
+import java.beans.*;
+
+/**
+ * BeanInfo for the ACSDtdDefinedElement class.
+ *
+ * @version $Revision$
+ * @author Nick Davisnick_home_account@yahoo.com
+ */
+public class ACSDtdDefinedElementBeanInfo extends BaseBeanInfo {
+ /**
+ * Default ctor.
+ *
+ */
+ public ACSDtdDefinedElementBeanInfo() {
+ }
+
+ /**
+ * Get the type that this BeanInfo represents.
+ *
+ * @return Type.
+ */
+ public Class getType() {
+ return ACSDtdDefinedElement.class;
+ }
+
+ /**
+ * Get the customizer type.
+ *
+ * @return Customizer type.
+ */
+ public Class getCustomizerType() {
+ return Customizer.class;
+ }
+
+ /**
+ * Get the property descriptors.
+ *
+ * @return Property descriptors.
+ */
+ public PropertyDescriptor[] getPropertyDescriptors() {
+ PropertyDescriptor[] retval = null;
+
+ try {
+ retval = new PropertyDescriptor[] {
+ new PropertyDescriptor(ACSDtdDefinedElement.TASK_TYPE,
+ ACSDtdDefinedElement.class,
+ "getTaskType", null),
+ new PropertyDescriptor(ACSDtdDefinedElement.NAMED_VALUES,
+ ACSDtdDefinedElement.class),
+ new PropertyDescriptor(ACSDtdDefinedElement.XML_STRING,
+ ACSDtdDefinedElement.class,
+ "getXMLString", null)
+ };
+ int pos = 0;
+ retval[pos++].setDisplayName(getResources().getString(
+ getClass(),ACSDtdDefinedElement.TASK_TYPE));
+ retval[pos++].setDisplayName(getResources().getString(
+ getClass(),ACSDtdDefinedElement.NAMED_VALUES));
+ retval[pos++].setDisplayName(getResources().getString(
+ getClass(),ACSDtdDefinedElement.XML_STRING));
+
+ setSortingOrder(retval);
+ } catch(IntrospectionException ex) {
+ ex.printStackTrace();
+ throw new Error(ex.toString());
+ }
+
+ return retval;
+ }
+
+ /** Customizer for this bean info. */
+ public static class Customizer extends DynamicCustomizer {
+ public Customizer() {
+ super(ACSDtdDefinedElement.class);
+ }
+ }
+}
+
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 65c391c91..c4feb5797 100644
--- a/src/antidote/org/apache/tools/ant/gui/acs/ACSFactory.java
+++ b/src/antidote/org/apache/tools/ant/gui/acs/ACSFactory.java
@@ -60,9 +60,7 @@ import java.net.URL;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import com.sun.xml.parser.Parser;
-import com.sun.xml.tree.SimpleElementFactory;
-import com.sun.xml.tree.XmlDocument;
-import com.sun.xml.tree.XmlDocumentBuilder;
+import com.sun.xml.tree.*;
import java.util.Properties;
import java.util.Enumeration;
import com.sun.xml.parser.Resolver;
@@ -92,7 +90,7 @@ public class ACSFactory {
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");
+ name, "org.apache.tools.ant.gui.acs.ACSDtdDefinedElement");
}
// Then we add/override the local definitions.
@@ -164,7 +162,6 @@ public class ACSFactory {
sax.parse(location.openStream(), null);
doc = builder.getDocument();
-
}
catch(ParserConfigurationException ex) {
ex.printStackTrace();
@@ -235,6 +232,22 @@ public class ACSFactory {
return retval;
}
+ /**
+ * Create a new element.
+ *
+ * @param node the Node to assign the property to.
+ * @param name the new elements type.
+ * @return New, unnamed property.
+ */
+ public ACSElement createElement(ACSElement node, String name) {
+ ACSElement retval = (ACSElement) node.
+ getOwnerDocument().createElement(name);
+ // XXX fixme.
+ indent(node, 1);
+ node.appendChild(retval);
+ return retval;
+ }
+
/**
* Insert a new line and indentation at the end of the given
* node in preparation for a new element being added.
diff --git a/src/antidote/org/apache/tools/ant/gui/acs/ACSInfoProvider.java b/src/antidote/org/apache/tools/ant/gui/acs/ACSInfoProvider.java
new file mode 100644
index 000000000..3764cc1b9
--- /dev/null
+++ b/src/antidote/org/apache/tools/ant/gui/acs/ACSInfoProvider.java
@@ -0,0 +1,75 @@
+/*
+ * 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", "Ant", 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.acs;
+
+/**
+ * Provides menu infomation for a node.
+ *
+ * @version $Revision$
+ * @author Nick Davisnick_home_account@yahoo.com
+ */
+public interface ACSInfoProvider {
+ /**
+ * Returns the menu items which may be used on this node.
+ * If the strings are not valid action IDs, use
+ * getDefaultActionID
to find the action for the menu item.
+ */
+ public String[] getMenuString();
+ /**
+ * Returns the action ID to use for a menu item which does not
+ * represent a valid action ID.
+ */
+ public String getDefaultActionID();
+}
+
diff --git a/src/antidote/org/apache/tools/ant/gui/acs/ACSNamedElement.java b/src/antidote/org/apache/tools/ant/gui/acs/ACSNamedElement.java
index 50cde38ec..96f747cfc 100644
--- a/src/antidote/org/apache/tools/ant/gui/acs/ACSNamedElement.java
+++ b/src/antidote/org/apache/tools/ant/gui/acs/ACSNamedElement.java
@@ -62,7 +62,7 @@ import java.util.StringTokenizer;
* @version $Revision$
* @author Simeon Fitch
*/
-public class ACSNamedElement extends ACSTreeNodeElement {
+public class ACSNamedElement extends ACSDtdDefinedElement {
/** The 'name' property name. */
public static final String NAME = "name";
/** The discription property name. */
@@ -73,7 +73,6 @@ public class ACSNamedElement extends ACSTreeNodeElement {
*
*/
public ACSNamedElement() {
-
}
/**
diff --git a/src/antidote/org/apache/tools/ant/gui/acs/ACSPropertyElement.java b/src/antidote/org/apache/tools/ant/gui/acs/ACSPropertyElement.java
index 5c9ad5f7a..9e13cafa1 100644
--- a/src/antidote/org/apache/tools/ant/gui/acs/ACSPropertyElement.java
+++ b/src/antidote/org/apache/tools/ant/gui/acs/ACSPropertyElement.java
@@ -61,7 +61,7 @@ import com.sun.xml.tree.ElementNode;
* @version $Revision$
* @author Simeon Fitch
*/
-public class ACSPropertyElement extends ACSTreeNodeElement {
+public class ACSPropertyElement extends ACSDtdDefinedElement {
/** The 'name' property name. */
public static final String NAME = "name";
/** The 'value' property name. */
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 b87275416..073d09725 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
@@ -3,10 +3,12 @@
#
# The default element
-*Element=org.apache.tools.ant.gui.acs.ACSDefaultElement
+*Element=org.apache.tools.ant.gui.acs.ACSDtdDefinedElement
# 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
task=org.apache.tools.ant.gui.acs.ACSTaskElement
+
+
diff --git a/src/antidote/org/apache/tools/ant/gui/acs/project-ext.dtd b/src/antidote/org/apache/tools/ant/gui/acs/project-ext.dtd
new file mode 100644
index 000000000..09243990d
--- /dev/null
+++ b/src/antidote/org/apache/tools/ant/gui/acs/project-ext.dtd
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/antidote/org/apache/tools/ant/gui/acs/project.dtd b/src/antidote/org/apache/tools/ant/gui/acs/project.dtd
new file mode 100644
index 000000000..8d14b5709
--- /dev/null
+++ b/src/antidote/org/apache/tools/ant/gui/acs/project.dtd
@@ -0,0 +1,282 @@
+
+
+
+
+
+
+%ext-file;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/antidote/org/apache/tools/ant/gui/command/DeleteElementCmd.java b/src/antidote/org/apache/tools/ant/gui/command/DeleteElementCmd.java
new file mode 100644
index 000000000..10a02d8c2
--- /dev/null
+++ b/src/antidote/org/apache/tools/ant/gui/command/DeleteElementCmd.java
@@ -0,0 +1,106 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2001 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", "Ant", 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.command;
+import java.util.EventObject;
+import javax.swing.JOptionPane;
+import org.w3c.dom.Node;
+import org.apache.tools.ant.gui.core.AppContext;
+import org.apache.tools.ant.gui.event.DeleteElementEvent;
+import org.apache.tools.ant.gui.acs.*;
+
+/**
+ * Command for removing the selected element.
+ *
+ * @version $Revision$
+ * @author Nick Davisnick_home_account@yahoo.com
+ */
+public class DeleteElementCmd extends AbstractCommand {
+
+ /**
+ * Standard ctor.
+ *
+ * @param context Application context.
+ */
+ public DeleteElementCmd(AppContext context) {
+ super(context);
+ }
+
+ /**
+ * Delete the selected element.
+ */
+ public void run() {
+
+ // Ask "Are you sure?"
+ int option = JOptionPane.showConfirmDialog(null, "Are You Sure?",
+ "Confirm Delete", JOptionPane.YES_NO_OPTION);
+
+ if (option == JOptionPane.YES_OPTION) {
+ // Find the element to remove
+ ACSElement[] vals = getContext().getSelectionManager().
+ getSelectedElements();
+ if(vals != null && vals.length > 0) {
+ Node item = vals[vals.length - 1];
+
+ // Find the parent and remove the element.
+ Node parent = item.getParentNode();
+ parent.removeChild(item);
+
+ // Notify the tree the element was removed.
+ DeleteElementEvent event = new DeleteElementEvent(
+ getContext(), (ACSElement) parent);
+ getContext().getEventBus().postEvent(event);
+ }
+ }
+ }
+}
diff --git a/src/antidote/org/apache/tools/ant/gui/command/NewElementCmd.java b/src/antidote/org/apache/tools/ant/gui/command/NewElementCmd.java
new file mode 100644
index 000000000..043a5ef79
--- /dev/null
+++ b/src/antidote/org/apache/tools/ant/gui/command/NewElementCmd.java
@@ -0,0 +1,155 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2001 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", "Ant", 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.command;
+import java.util.EventObject;
+import javax.swing.AbstractButton;
+import javax.swing.Action;
+import org.apache.tools.ant.gui.core.AppContext;
+import org.apache.tools.ant.gui.event.NewBaseElementEvent;
+import org.apache.tools.ant.gui.event.RefreshDisplayEvent;
+import org.apache.tools.ant.gui.acs.*;
+import org.apache.tools.ant.gui.util.WindowUtils;
+import org.apache.tools.ant.gui.core.AntAction;
+
+/**
+ * Command for creating a new propertyh.
+ *
+ * @version $Revision$
+ * @author Simeon Fitch
+ */
+public class NewElementCmd extends AbstractCommand {
+ /** New count for this session. Used to create default names,
+ * numbered as a convenience. */
+ private static int _count = 1;
+ private EventObject _event = null;
+
+ /**
+ * Standard ctor.
+ *
+ * @param context Application context.
+ */
+ public NewElementCmd(AppContext context, EventObject event) {
+ super(context);
+ _event = event;
+ }
+
+ /**
+ * Creates a new xml element based on the button which
+ * was pressed. The button text may contain the name
+ * of the new element or a dialog box is presented which
+ * asks the user for the element type.
+ */
+ public void run() {
+
+ // Find which element is selected.
+ ACSElement[] vals = getContext().getSelectionManager().
+ getSelectedElements();
+ if(vals == null || vals.length == 0) {
+ return;
+ }
+
+ // Find the text of the button which was pressed
+ // to determine the type of element to create.
+ Object source = _event.getSource();
+ if (!(source instanceof AbstractButton)) {
+ return;
+ }
+ AbstractButton button = (AbstractButton) source;
+ String name = button.getText();
+
+ // Get the AntAction
+ Action action = button.getAction();
+ if (!(action instanceof AntAction)) {
+ return;
+ }
+ AntAction antAction = (AntAction) action;
+
+ ACSElement e = vals[vals.length - 1];
+
+ // Should we prompt the user use the element type?
+ if (antAction.getName().equals(name)) {
+
+ // Display the dialog box.
+ ACSDtdDefinedElement dtde = (ACSDtdDefinedElement) e;
+ NewElementDlg dlg = new NewElementDlg(
+ getContext().getParentFrame(), true);
+ dlg.setList(dtde.getPossibleChildren());
+ dlg.pack();
+ WindowUtils.centerWindow(dlg);
+ dlg.setTitle("Select the new element type");
+ dlg.setVisible(true);
+
+ // Get the element type
+ if (dlg.getCancel()) {
+ name = "";
+ } else {
+ name = dlg.getElementName();
+ }
+ }
+
+ if (name.length() > 0) {
+ // Create the new element
+ ACSElement retval =
+ ACSFactory.getInstance().createElement(e, name);
+ getContext().getEventBus().postEvent(
+ new NewBaseElementEvent(getContext(), retval));
+ } else {
+ // Request a refresh so the popup menu is removed
+ // from the display.
+ getContext().getEventBus().postEvent(
+ new RefreshDisplayEvent(getContext()));
+ }
+ }
+}
+
diff --git a/src/antidote/org/apache/tools/ant/gui/command/NewElementDlg.java b/src/antidote/org/apache/tools/ant/gui/command/NewElementDlg.java
new file mode 100644
index 000000000..410ffcb0b
--- /dev/null
+++ b/src/antidote/org/apache/tools/ant/gui/command/NewElementDlg.java
@@ -0,0 +1,261 @@
+/*
+ * 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", "Ant", 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.command;
+import javax.swing.*;
+
+/**
+ * A Dialog which asks for a new xml element's type.
+ *
+ * @version $Revision$
+ * @author Nick Davisnick_home_account@yahoo.com
+ */
+public class NewElementDlg extends javax.swing.JDialog {
+ // Dialog's components
+ private javax.swing.JPanel _southPanel;
+ private javax.swing.JPanel _buttonPanel;
+ private javax.swing.JButton _buttonOK;
+ private javax.swing.JButton _buttonCancel;
+ private javax.swing.JPanel _selectPanel;
+ private javax.swing.JPanel _panelData;
+ private javax.swing.JLabel _label;
+ private javax.swing.JTextField _elementText;
+ private javax.swing.JScrollPane _listScrollPane;
+ private javax.swing.JList _elementList;
+ /** set to true if cancel is pressed */
+ private boolean _cancel = true;
+ /** holds the element type */
+ private String _elementName;
+
+ /**
+ * Creates new form NewElementDlg
+ */
+ public NewElementDlg(java.awt.Frame parent,boolean modal) {
+ super(parent, modal);
+ initComponents();
+ enableButtons();
+ }
+
+ /**
+ * Fills the listbox with the input list.
+ */
+ public void setList(String[] list) {
+ if (list == null || list.length == 0) {
+ _listScrollPane.setVisible(false);
+ } else {
+ _elementList.setListData(list);
+ }
+ }
+
+ /**
+ * Returns true if cancel was pressed
+ */
+ public boolean getCancel() {
+ return _cancel;
+ }
+
+ /**
+ * Returns the entered element type
+ */
+ public String getElementName() {
+ return _elementName;
+ }
+
+ /**
+ * Enable or disable buttons
+ */
+ private void enableButtons() {
+ if (_elementText.getText().length() > 0) {
+ _buttonOK.setEnabled(true);
+ } else {
+ _buttonOK.setEnabled(false);
+ }
+ }
+
+ /**
+ * This method is called from within the constructor to
+ * initialize the form.
+ */
+ private void initComponents() {
+ _southPanel = new javax.swing.JPanel();
+ _buttonPanel = new javax.swing.JPanel();
+ _buttonOK = new javax.swing.JButton();
+ _buttonCancel = new javax.swing.JButton();
+ _selectPanel = new javax.swing.JPanel();
+ _panelData = new javax.swing.JPanel();
+ _label = new javax.swing.JLabel();
+ _elementText = new javax.swing.JTextField();
+ _listScrollPane = new javax.swing.JScrollPane();
+ _elementList = new javax.swing.JList();
+ getContentPane().setLayout(new java.awt.BorderLayout(10, 10));
+ addWindowListener(new java.awt.event.WindowAdapter() {
+ public void windowClosing(java.awt.event.WindowEvent evt) {
+ closeDialog(evt);
+ }
+ }
+ );
+
+ _southPanel.setLayout(new java.awt.FlowLayout(2, 2, 0));
+ _southPanel.setPreferredSize(new java.awt.Dimension(156, 50));
+ _southPanel.setMinimumSize(new java.awt.Dimension(154, 50));
+
+ _buttonPanel.setLayout(new java.awt.FlowLayout(1, 2, 0));
+ _buttonPanel.setPreferredSize(new java.awt.Dimension(146, 50));
+ _buttonPanel.setMinimumSize(new java.awt.Dimension(150, 50));
+ _buttonPanel.setAlignmentY(0.0F);
+ _buttonPanel.setAlignmentX(0.0F);
+
+ _buttonOK.setText("OK");
+ _buttonOK.setPreferredSize(new java.awt.Dimension(50, 30));
+ _buttonOK.setMaximumSize(new java.awt.Dimension(50, 30));
+ _buttonOK.setMargin(new java.awt.Insets(10, 10, 10, 10));
+ _buttonOK.setMinimumSize(new java.awt.Dimension(50, 30));
+ _buttonOK.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ clickOK(evt);
+ }
+ }
+ );
+ _buttonPanel.add(_buttonOK);
+ _buttonCancel.setText("Cancel");
+ _buttonCancel.setPreferredSize(new java.awt.Dimension(70, 30));
+ _buttonCancel.setMaximumSize(new java.awt.Dimension(60, 30));
+ _buttonCancel.setMargin(new java.awt.Insets(10, 10, 10, 10));
+ _buttonCancel.setMinimumSize(new java.awt.Dimension(60, 30));
+ _buttonCancel.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ clickCancel(evt);
+ }
+ }
+ );
+ _buttonPanel.add(_buttonCancel);
+ _southPanel.add(_buttonPanel);
+ getContentPane().add(_southPanel, java.awt.BorderLayout.SOUTH);
+ _selectPanel.setLayout(new java.awt.BorderLayout(10, 10));
+ _selectPanel.setBorder(new javax.swing.border.EtchedBorder());
+ _label.setText("Element Type:");
+ _label.setAlignmentX(0.5F);
+ _panelData.add(_label);
+
+
+ _elementText.setPreferredSize(new java.awt.Dimension(110, 25));
+ _elementText.setMargin(new java.awt.Insets(2, 2, 2, 2));
+ _elementText.setMinimumSize(new java.awt.Dimension(14, 25));
+ _elementText.addKeyListener(new java.awt.event.KeyAdapter() {
+ public void keyReleased(java.awt.event.KeyEvent evt) {
+ _elementTextKeyReleased(evt);
+ }
+ }
+ );
+ _panelData.add(_elementText);
+
+ _selectPanel.add(_panelData, java.awt.BorderLayout.SOUTH);
+
+ _elementList.setMaximumSize(new java.awt.Dimension(100, 20));
+ _elementList.setMinimumSize(new java.awt.Dimension(10, 10));
+ _elementList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
+ public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
+ itemSelected(evt);
+ }
+ }
+ );
+ _listScrollPane.setViewportView(_elementList);
+
+ _selectPanel.add(_listScrollPane, java.awt.BorderLayout.CENTER);
+ getContentPane().add(_selectPanel, java.awt.BorderLayout.CENTER);
+ pack();
+ }
+
+ /** Called when a key is released */
+ private void _elementTextKeyReleased(java.awt.event.KeyEvent evt) {
+ enableButtons();
+ }
+
+ /** Called when an item is selected from the list */
+ private void itemSelected(javax.swing.event.ListSelectionEvent evt) {
+ _elementText.setText((String) _elementList.getSelectedValue());
+ enableButtons();
+ }
+
+ /** Called when the Cancel button is pressed */
+ private void clickCancel(java.awt.event.ActionEvent evt) {
+ // Add your handling code here:
+ setVisible(false);
+ dispose();
+ _cancel = true;
+ }
+
+ /** Called when the OK button is pressed */
+ private void clickOK(java.awt.event.ActionEvent evt) {
+ setVisible(false);
+ dispose();
+ _cancel = false;
+ _elementName = _elementText.getText();
+ }
+
+ /** Closes the dialog */
+ private void closeDialog(java.awt.event.WindowEvent evt) {
+ setVisible(false);
+ dispose();
+ }
+
+ /**
+ * Test the dialog
+ *
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {
+ new NewElementDlg(new javax.swing.JFrame(), true).show();
+ }
+}
diff --git a/src/antidote/org/apache/tools/ant/gui/core/ActionManager.java b/src/antidote/org/apache/tools/ant/gui/core/ActionManager.java
index 0807ba958..64fa94b36 100644
--- a/src/antidote/org/apache/tools/ant/gui/core/ActionManager.java
+++ b/src/antidote/org/apache/tools/ant/gui/core/ActionManager.java
@@ -72,6 +72,8 @@ import java.lang.reflect.Constructor;
public class ActionManager {
/** Parameters for the Command constructor. */
private static final Class[] COMMAND_CTOR_PARAMS = { AppContext.class };
+ private static final Class[] COMMAND_CTOR_PARAMS_WITH_EVENT =
+ { AppContext.class, EventObject.class };
/** Externalized resources. */
private ResourceManager _resources = null;
@@ -207,6 +209,12 @@ public class ActionManager {
for(int i = 0; i < _actionIDs.length; i++) {
AntAction action = (AntAction) _actions.get(_actionIDs[i]);
+
+ // If the action is hidden do not display it.
+ if(action.isHidden()) {
+ continue;
+ }
+
// If it has an icon, then we add it to the toolbar.
if(action.getIcon() != null) {
if(action.isPreceededBySeparator()) {
@@ -232,22 +240,39 @@ public class ActionManager {
return retval;
}
- /**
+ /**
* Create a popup menu with the given actionIDs.
- * XXX check this for object leak. Does the button
- * get added to the action as a listener? There are also some
- * changes to this behavior in 1.3.
- *
+ * XXX check this for object leak. Does the button
+ * get added to the action as a listener? There are also some
+ * changes to this behavior in 1.3.
+ *
* @param actionIDs List of action IDs for actions
- * to appear in popup menu.
+ * to appear in popup menu.
+ * @param defaultID Use this action ID if the item
+ * from the list is not found.
* @return Popup menu to display.
*/
- public JPopupMenu createPopup(String[] actionIDs) {
+ public JPopupMenu createPopup(String[] actionIDs, String defaultID) {
+
JPopupMenu retval = new JPopupMenu();
for(int i = 0; i < actionIDs.length; i++) {
AntAction action = (AntAction) _actions.get(actionIDs[i]);
- if(action != null) {
+
+ // If the ID is not found, use the default.
+ if (action == null && defaultID != null) {
+ action = (AntAction) _actions.get(defaultID);
+ AbstractButton button = retval.add(action);
+
+ // Set the button text to the action ID.
+ button.setText(actionIDs[i]);
+ addNiceStuff(button, action);
+ } else {
+ if(action.isPopupPreceededBySeparator() &&
+ retval.getComponentCount() > 0) {
+ retval.addSeparator();
+ }
+
AbstractButton button = retval.add(action);
addNiceStuff(button, action);
}
@@ -256,27 +281,37 @@ public class ActionManager {
return retval;
}
- /**
+ /**
* Get the command assocaited with the Action with the given id.
- *
+ *
* @param actionID Id of action to get command for.
* @return Command associated with action, or null if none available.
*/
- public Command getActionCommand(String actionID, AppContext context) {
+ public Command getActionCommand(String actionID,
+ AppContext context,
+ EventObject event) {
Command retval = null;
AntAction action = (AntAction) _actions.get(actionID);
if(action != null) {
Class clazz = action.getCommandClass();
if(clazz != null) {
try {
- Constructor ctor =
+ Constructor ctor =
clazz.getConstructor(COMMAND_CTOR_PARAMS);
retval = (Command) ctor.newInstance(
new Object[] { context });
}
catch(Exception ex) {
- // XXX log me.
- ex.printStackTrace();
+ try {
+ Constructor ctor = clazz.getConstructor(
+ COMMAND_CTOR_PARAMS_WITH_EVENT);
+ retval = (Command) ctor.newInstance(
+ new Object[] { context, event });
+ }
+ catch (Exception ex2) {
+ // XXX log me.
+ ex.printStackTrace();
+ }
}
}
}
diff --git a/src/antidote/org/apache/tools/ant/gui/core/AntAction.java b/src/antidote/org/apache/tools/ant/gui/core/AntAction.java
index 9289f434d..e1eb5301d 100644
--- a/src/antidote/org/apache/tools/ant/gui/core/AntAction.java
+++ b/src/antidote/org/apache/tools/ant/gui/core/AntAction.java
@@ -73,6 +73,7 @@ public class AntAction extends AbstractAction {
/** Property name for the parent menu item. */
public static final String PARENT_MENU_NAME = "parentMenuName";
public static final String SEPARATOR = "separator";
+ public static final String POPUP_SEPARATOR = "popupSeparator";
public static final String ACCELERATOR = "accelerator";
public static final String ENABLED = "enabled";
public static final String ENABLE_ON = "enableOn";
@@ -81,6 +82,7 @@ public class AntAction extends AbstractAction {
public static final String CHECKED_TRUE_ON = "checkedTrueOn";
public static final String CHECKED_FALSE_ON = "checkedFalseOn";
public static final String COMMAND = "command";
+ public static final String HIDDEN = "hidden";
/** Property resources. */
private ResourceManager _resources = null;
@@ -118,6 +120,8 @@ public class AntAction extends AbstractAction {
putValue(SHORT_DESCRIPTION, getString("shortDescription"));
putValue(PARENT_MENU_NAME, getString(PARENT_MENU_NAME));
putValue(SEPARATOR, getString(SEPARATOR));
+ putValue(POPUP_SEPARATOR, getString(POPUP_SEPARATOR));
+ putValue(HIDDEN, getString(HIDDEN));
// Set the default enabled state.
@@ -268,6 +272,28 @@ public class AntAction extends AbstractAction {
return (Icon) getValue(SMALL_ICON);
}
+ /**
+ * Determine if a separator should appear before the action
+ * when the popup menu is created.
+ *
+ * @return True if add separator, false otherwise.
+ */
+ public boolean isPopupPreceededBySeparator() {
+ return Boolean.valueOf(
+ String.valueOf(getValue(POPUP_SEPARATOR))).booleanValue();
+ }
+
+ /**
+ * Determine if the action is hidden and should not
+ * be displayed from a button.
+ *
+ * @return True the action is hidden.
+ */
+ public boolean isHidden() {
+ return Boolean.valueOf(
+ String.valueOf(getValue(HIDDEN))).booleanValue();
+ }
+
/**
* Get the accelerator keystroke.
*
diff --git a/src/antidote/org/apache/tools/ant/gui/core/EventResponder.java b/src/antidote/org/apache/tools/ant/gui/core/EventResponder.java
index 99c571504..66545bbeb 100644
--- a/src/antidote/org/apache/tools/ant/gui/core/EventResponder.java
+++ b/src/antidote/org/apache/tools/ant/gui/core/EventResponder.java
@@ -113,9 +113,8 @@ public class EventResponder {
*/
public boolean eventPosted(EventObject event) {
String command = ((ActionEvent)event).getActionCommand();
-
Command cmd =
- _context.getActions().getActionCommand(command, _context);
+ _context.getActions().getActionCommand(command, _context, event);
if(cmd != null) {
cmd.run();
return false;
diff --git a/src/antidote/org/apache/tools/ant/gui/event/DeleteElementEvent.java b/src/antidote/org/apache/tools/ant/gui/event/DeleteElementEvent.java
new file mode 100644
index 000000000..1803e6cba
--- /dev/null
+++ b/src/antidote/org/apache/tools/ant/gui/event/DeleteElementEvent.java
@@ -0,0 +1,88 @@
+/*
+ * 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", "Ant", 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.core.AppContext;
+import org.apache.tools.ant.gui.acs.ACSProjectElement;
+import org.apache.tools.ant.gui.acs.ACSElement;
+
+/**
+ * FIX UP Nick
+ */
+public class DeleteElementEvent extends AntEvent {
+
+ ACSElement _element = null;
+
+ /**
+ * Standard ctor.
+ *
+ * @param context application context.
+ */
+ public DeleteElementEvent(AppContext context,ACSElement e) {
+ super(context);
+ if(e == null) {
+ throw new IllegalArgumentException("A deleted element can't be null.");
+ }
+ _element = e;
+ }
+
+ /**
+ * Get the newly added project.
+ *
+ * @return New project.
+ */
+ public ACSElement getDeletedElement() {
+ return _element;
+ }
+
+}
diff --git a/src/antidote/org/apache/tools/ant/gui/event/DtdDefinedElementSelectionEvent.java b/src/antidote/org/apache/tools/ant/gui/event/DtdDefinedElementSelectionEvent.java
new file mode 100644
index 000000000..73f3d7336
--- /dev/null
+++ b/src/antidote/org/apache/tools/ant/gui/event/DtdDefinedElementSelectionEvent.java
@@ -0,0 +1,83 @@
+/*
+ * 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", "Ant", 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.ACSElement;
+import org.apache.tools.ant.gui.acs.ACSDtdDefinedElement;
+import org.apache.tools.ant.gui.core.AppContext;
+
+/**
+ * Event indicating that a DtdDefined element was selected.
+ *
+ * @version $Revision$
+ * @author Nick Davisnick_home_account@yahoo.com
+ */
+public class DtdDefinedElementSelectionEvent extends ElementSelectionEvent {
+ /**
+ * Standard ctor.
+ *
+ * @param context application context.
+ * @param selected the selected Elements.
+ */
+ public DtdDefinedElementSelectionEvent(AppContext context,ACSElement[] selected) {
+ super(context, selected);
+ }
+
+ /**
+ * Get the selected properties.
+ */
+ public ACSDtdDefinedElement[] getSelectedProperties() {
+ return (ACSDtdDefinedElement[]) getFiltered(ACSDtdDefinedElement.class);
+ }
+
+}
diff --git a/src/antidote/org/apache/tools/ant/gui/event/ElementSelectionEvent.java b/src/antidote/org/apache/tools/ant/gui/event/ElementSelectionEvent.java
index d7da26dcf..0aa5faeee 100644
--- a/src/antidote/org/apache/tools/ant/gui/event/ElementSelectionEvent.java
+++ b/src/antidote/org/apache/tools/ant/gui/event/ElementSelectionEvent.java
@@ -132,19 +132,23 @@ public class ElementSelectionEvent extends AntEvent {
if(selected != null && selected.length > 0) {
Class type = selected[selected.length - 1].getClass();
- if(type.isAssignableFrom(ACSTargetElement.class)) {
+ if(ACSTargetElement.class.isAssignableFrom(type)) {
retval = new TargetSelectionEvent(context, selected);
}
- else if(type.isAssignableFrom(ACSTaskElement.class)) {
+ else if(ACSTaskElement.class.isAssignableFrom(type)) {
retval = new TaskSelectionEvent(context, selected);
}
- else if(type.isAssignableFrom(ACSPropertyElement.class)) {
+ else if(ACSPropertyElement.class.isAssignableFrom(type)) {
retval = new PropertySelectionEvent(context, selected);
}
- else if(type.isAssignableFrom(ACSProjectElement.class)) {
+ else if(ACSProjectElement.class.isAssignableFrom(type)) {
retval = new ProjectSelectedEvent(
context, (ACSProjectElement) selected[0]);
}
+ else if(ACSDtdDefinedElement.class.isAssignableFrom(type)) {
+ retval = new DtdDefinedElementSelectionEvent(
+ context, selected);
+ }
else {
// For elements without a specific event
// type just send and instance of this.
diff --git a/src/antidote/org/apache/tools/ant/gui/event/NewBaseElementEvent.java b/src/antidote/org/apache/tools/ant/gui/event/NewBaseElementEvent.java
new file mode 100644
index 000000000..a45113c5f
--- /dev/null
+++ b/src/antidote/org/apache/tools/ant/gui/event/NewBaseElementEvent.java
@@ -0,0 +1,91 @@
+/*
+ * 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", "Ant", 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.core.AppContext;
+import org.apache.tools.ant.gui.acs.ACSProjectElement;
+import org.apache.tools.ant.gui.acs.ACSElement;
+
+/**
+ * Event indicating that a new node was added.
+ *
+ * @version $Revision$
+ * @author Nick Davisnick_home_account@yahoo.com
+ */
+public class NewBaseElementEvent extends AntEvent implements NewElementEvent {
+
+ ACSElement _element = null;
+
+ /**
+ * Standard ctor.
+ *
+ * @param context application context.
+ */
+ public NewBaseElementEvent(AppContext context,ACSElement e) {
+ super(context);
+ if(e == null) {
+ throw new IllegalArgumentException("A new element can't be null.");
+ }
+ _element = e;
+ }
+
+ /**
+ * Get the element.
+ *
+ * @return New project.
+ */
+ public ACSElement getNewElement() {
+ return _element;
+ }
+
+}
diff --git a/src/antidote/org/apache/tools/ant/gui/event/RefreshDisplayEvent.java b/src/antidote/org/apache/tools/ant/gui/event/RefreshDisplayEvent.java
new file mode 100644
index 000000000..f6996d45b
--- /dev/null
+++ b/src/antidote/org/apache/tools/ant/gui/event/RefreshDisplayEvent.java
@@ -0,0 +1,74 @@
+/*
+ * 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", "Ant", 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.core.*;
+import org.apache.tools.ant.gui.command.*;
+
+/**
+ * Request to show the console pane
+ *
+ * @version $Revision$
+ * @author Nick Davisnick_home_account@yahoo.com
+ */
+public class RefreshDisplayEvent extends AntEvent {
+ /**
+ * Standard ctor.
+ *
+ * @param context application context.
+ */
+ public RefreshDisplayEvent(AppContext context) {
+ super(context);
+ }
+}
diff --git a/src/antidote/org/apache/tools/ant/gui/modules/edit/ElementNavigator.java b/src/antidote/org/apache/tools/ant/gui/modules/edit/ElementNavigator.java
index 2f911fbd2..2505453e7 100644
--- a/src/antidote/org/apache/tools/ant/gui/modules/edit/ElementNavigator.java
+++ b/src/antidote/org/apache/tools/ant/gui/modules/edit/ElementNavigator.java
@@ -138,6 +138,9 @@ public class ElementNavigator extends AntModule {
// The project node has changed.
model.fireNodeChanged((ACSElement)event.getSource());
}
+ else if(event instanceof RefreshDisplayEvent && model != null) {
+ _tree.updateUI();
+ }
else if(event instanceof NewElementEvent && model != null) {
ACSElement element = ((NewElementEvent)event).getNewElement();
model.fireNodeAdded(element);
@@ -145,6 +148,9 @@ public class ElementNavigator extends AntModule {
_selections.setSelectionPath(path);
_tree.scrollPathToVisible(path);
}
+ else if(event instanceof DeleteElementEvent && model != null) {
+ _tree.updateUI();
+ }
else {
ACSProjectElement project = null;
if(event instanceof ProjectSelectedEvent) {
@@ -163,11 +169,31 @@ public class ElementNavigator extends AntModule {
ElementSelectionEvent.createEvent(getContext(), null);
}
else {
- _tree.setModel(new ElementTreeModel(project));
- _selections = new ElementTreeSelectionModel();
- _selections.addTreeSelectionListener(
- new SelectionForwarder());
- _tree.setSelectionModel(_selections);
+ boolean updateModel = false;
+ TreeModel testModel = _tree.getModel();
+
+ // Set the model if's not an ElementTreeModel
+ if (testModel instanceof ElementTreeModel) {
+ ElementTreeModel etm = (ElementTreeModel) testModel;
+ ACSProjectElement currentProject =
+ (ACSProjectElement) etm.getRoot();
+
+ // Set the model if the project is wrong
+ if (currentProject != project) {
+ updateModel = true;
+ }
+ } else {
+ updateModel = true;
+ }
+
+ // Should we update the tree model
+ if (updateModel) {
+ _tree.setModel(new ElementTreeModel(project));
+ _selections = new ElementTreeSelectionModel();
+ _selections.addTreeSelectionListener(
+ new SelectionForwarder());
+ _tree.setSelectionModel(_selections);
+ }
}
}
return true;
@@ -195,7 +221,9 @@ public class ElementNavigator extends AntModule {
return event instanceof ProjectSelectedEvent ||
event instanceof ProjectClosedEvent ||
event instanceof NewElementEvent ||
- event instanceof PropertyChangeEvent;
+ event instanceof PropertyChangeEvent ||
+ event instanceof DeleteElementEvent ||
+ event instanceof RefreshDisplayEvent;
}
}
@@ -203,11 +231,42 @@ public class ElementNavigator extends AntModule {
private class PopupHandler extends MouseAdapter {
private void handle(MouseEvent e) {
if(e.isPopupTrigger()) {
- ActionManager mgr = getContext().getActions();
- JPopupMenu menu = mgr.createPopup(
- getContext().getResources().getStringArray(
- ElementNavigator.class, "popupActions"));
- menu.show((JComponent)e.getSource(), e.getX(), e.getY());
+ Object source = e.getSource();
+ String[] menuStr = null;
+ JTree tree = (JTree) source;
+
+ // Find the selected path.
+ TreePath selPath = tree.getPathForLocation(
+ e.getX(), e.getY());
+ if (selPath == null) {
+ return;
+ }
+
+ // Update the selection.
+ tree.setSelectionPath(selPath);
+
+ // Find the selected object.
+ Object selObj = selPath.getLastPathComponent();
+
+ String defaultID = null;
+
+ // Does the item provide its own menu?
+ if (selObj instanceof ACSInfoProvider) {
+ ACSInfoProvider ip = (ACSInfoProvider) selObj;
+ menuStr = ip.getMenuString();
+ defaultID = ip.getDefaultActionID();
+ } else {
+ // Get the menu from the prop file.
+ menuStr = getContext().getResources().getStringArray(
+ ElementNavigator.class, defaultID);
+ }
+
+ // Should we create a menu?
+ if (menuStr != null && menuStr.length != 0) {
+ ActionManager mgr = getContext().getActions();
+ JPopupMenu menu = mgr.createPopup(menuStr, defaultID);
+ menu.show((JComponent)e.getSource(), e.getX(), e.getY());
+ }
}
}
diff --git a/src/antidote/org/apache/tools/ant/gui/resources/action.properties b/src/antidote/org/apache/tools/ant/gui/resources/action.properties
index c4b59a835..7ecb66cc1 100644
--- a/src/antidote/org/apache/tools/ant/gui/resources/action.properties
+++ b/src/antidote/org/apache/tools/ant/gui/resources/action.properties
@@ -4,7 +4,7 @@ menus=File, View, Build, Projects, Help
# Declare the list of known actions.
actions=\
new, open, save, saveas, close, exit, about, \
- newTarget, newTask, newProperty \
+ newTarget, newElement, newProperty, deleteElement, \
startBuild, stopBuild, viewConsole
# Configure the decalred actions.
@@ -120,7 +120,8 @@ newTarget.disableOn=\
org.apache.tools.ant.gui.event.TaskSelectionEvent, \
org.apache.tools.ant.gui.event.PropertySelectionEvent, \
org.apache.tools.ant.gui.event.ProjectClosedEvent, \
- org.apache.tools.ant.gui.event.NullSelectionEvent
+ org.apache.tools.ant.gui.event.NullSelectionEvent, \
+ org.apache.tools.ant.gui.event.DtdDefinedElementSelectionEvent
newTask.name=New Task
newTask.shortDescription=Create a new task under the selected target
@@ -133,7 +134,8 @@ newTask.disableOn=\
org.apache.tools.ant.gui.event.ProjectClosedEvent, \
org.apache.tools.ant.gui.event.TaskSelectionEvent, \
org.apache.tools.ant.gui.event.PropertySelectionEvent, \
- org.apache.tools.ant.gui.event.NullSelectionEvent
+ org.apache.tools.ant.gui.event.NullSelectionEvent, \
+ org.apache.tools.ant.gui.event.DtdDefinedElementSelectionEvent
newProperty.name=New Property
newProperty.shortDescription=Create a new property under the selected element
@@ -148,7 +150,24 @@ newProperty.enableOn=\
newProperty.disableOn=\
org.apache.tools.ant.gui.event.PropertySelectionEvent, \
org.apache.tools.ant.gui.event.ProjectClosedEvent, \
- org.apache.tools.ant.gui.event.NullSelectionEvent
+ org.apache.tools.ant.gui.event.NullSelectionEvent, \
+ org.apache.tools.ant.gui.event.DtdDefinedElementSelectionEvent
+
+newElement.name=New Element
+newElement.shortDescription=Create a new element under the selected element
+newElement.icon=default.gif
+newElement.command=org.apache.tools.ant.gui.command.NewElementCmd
+newElement.enabled=true
+newElement.hidden=true
+newElement.popupSeparator=true
+
+deleteElement.name=Delete Element
+deleteElement.shortDescription=Delete the selected element
+deleteElement.icon=default.gif
+deleteElement.command=org.apache.tools.ant.gui.command.DeleteElementCmd
+deleteElement.enabled=true
+deleteElement.hidden=true
+deleteElement.popupSeparator=true
viewConsole.name=console
viewConsole.shortDescription=Displays or hides the console pane
diff --git a/src/antidote/org/apache/tools/ant/gui/resources/antidote.properties b/src/antidote/org/apache/tools/ant/gui/resources/antidote.properties
index bea4a3c23..d1ec98e91 100644
--- a/src/antidote/org/apache/tools/ant/gui/resources/antidote.properties
+++ b/src/antidote/org/apache/tools/ant/gui/resources/antidote.properties
@@ -108,6 +108,14 @@ org.apache.tools.ant.gui.acs.ACSTaskElementBeanInfo.namedValues=Attributes
org.apache.tools.ant.gui.acs.ACSTaskElementBeanInfo.xmlString=XML Code
org.apache.tools.ant.gui.acs.ACSTaskElementBeanInfo.icon=task.gif
+org.apache.tools.ant.gui.acs.ACSDtdDefinedElementBeanInfo.beanName=
+org.apache.tools.ant.gui.acs.ACSDtdDefinedElementBeanInfo.beanDescription=\
+ A scoped property
+org.apache.tools.ant.gui.acs.ACSDtdDefinedElementBeanInfo.taskType=Type
+org.apache.tools.ant.gui.acs.ACSDtdDefinedElementBeanInfo.namedValues=\
+ Attributes
+org.apache.tools.ant.gui.acs.ACSDtdDefinedElementBeanInfo.xmlString=XML Code
+org.apache.tools.ant.gui.acs.ACSDtdDefinedElementBeanInfo.icon=default.gif
org.apache.tools.ant.gui.command.NewProjectCmd.defName=New Project
org.apache.tools.ant.gui.command.NewTargetCmd.defName=New Target