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