to allow for custom editor. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268921 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -0,0 +1,103 @@ | |||
| /* | |||
| * 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 | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.gui.acs; | |||
| import org.apache.tools.ant.gui.acs.ACSDocumentType.DtdElement; | |||
| import java.util.Properties; | |||
| /** | |||
| * Represents the attributes defined by the DTD. | |||
| * | |||
| * @version $Revision$ | |||
| * @author Nick Davis<a href="mailto:nick_home_account@yahoo.com">nick_home_account@yahoo.com</a> | |||
| */ | |||
| public class ACSDtdDefinedAttributes extends Properties { | |||
| ACSDocumentType.DtdElement _element = null; | |||
| /** | |||
| * Default constructor | |||
| */ | |||
| public ACSDtdDefinedAttributes() { | |||
| this(null); | |||
| } | |||
| /** | |||
| * Constructor | |||
| * | |||
| * @param element provides information about possible attributes. | |||
| */ | |||
| public ACSDtdDefinedAttributes(ACSDocumentType.DtdElement element) { | |||
| _element = element; | |||
| } | |||
| /** | |||
| * Return the required attributes or null. | |||
| */ | |||
| public String[] getRequiredAttributes() { | |||
| if (_element == null) { | |||
| return null; | |||
| } | |||
| return _element.getAttributes().getRequiredAttributes(); | |||
| } | |||
| /** | |||
| * Return the optional attributes or null. | |||
| */ | |||
| public String[] getOptionalAttributes() { | |||
| if (_element == null) { | |||
| return null; | |||
| } | |||
| return _element.getAttributes().getOptionalAttributes(); | |||
| } | |||
| } | |||
| @@ -75,6 +75,8 @@ implements ACSInfoProvider { | |||
| static ACSDocumentType docType = new ACSDocumentType(); | |||
| /** Our menu string */ | |||
| public String[] menuString = null; | |||
| /** The DTD element we represent */ | |||
| private ACSDocumentType.DtdElement _dtdElement = null; | |||
| /** | |||
| * Default ctor. | |||
| @@ -110,8 +112,9 @@ implements ACSInfoProvider { | |||
| * | |||
| * @return Name-value mappings. | |||
| */ | |||
| public Properties getNamedValues() { | |||
| Properties retval = new Properties(); | |||
| public ACSDtdDefinedAttributes getNamedValues() { | |||
| ACSDtdDefinedAttributes retval = | |||
| new ACSDtdDefinedAttributes(getDtdElement()); | |||
| NamedNodeMap attribs = getAttributes(); | |||
| for(int i = 0, len = attribs.getLength(); i < len; i++) { | |||
| @@ -128,34 +131,34 @@ implements ACSInfoProvider { | |||
| * | |||
| * @param attributes New attribute set. | |||
| */ | |||
| public void setNamedValues(Properties props) { | |||
| // XXX this code really sucks. It is really annoying that the | |||
| public void setNamedValues(ACSDtdDefinedAttributes attributes) { | |||
| // 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 | |||
| // "removeAllAttributes()" method, but instead make you | |||
| // remove each attribute individually, or require you to figure | |||
| // out what the differences are between the two. | |||
| // 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 | |||
| // 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(); | |||
| ACSDtdDefinedAttributes old = (ACSDtdDefinedAttributes) getNamedValues(); | |||
| Enumeration enum = old.propertyNames(); | |||
| while(enum.hasMoreElements()) { | |||
| String name = (String) enum.nextElement(); | |||
| removeAttribute(name); | |||
| } | |||
| enum = props.propertyNames(); | |||
| enum = attributes.propertyNames(); | |||
| while(enum.hasMoreElements()) { | |||
| String key = (String) enum.nextElement(); | |||
| setAttribute(key, props.getProperty(key)); | |||
| setAttribute(key, attributes.getProperty(key)); | |||
| } | |||
| firePropertyChange(NAMED_VALUES, old, props); | |||
| firePropertyChange(NAMED_VALUES, old, attributes); | |||
| } | |||
| /** | |||
| @@ -211,5 +214,38 @@ implements ACSInfoProvider { | |||
| } | |||
| return null; | |||
| } | |||
| /** | |||
| * Adds the attributes which are required by this node. | |||
| */ | |||
| public void addRequiredAttributes() { | |||
| ACSDocumentType.DtdElement e = getDtdElement(); | |||
| if (e == null) { | |||
| return; | |||
| } | |||
| String[] attributes = e.getAttributes().getRequiredAttributes(); | |||
| if (attributes == null) { | |||
| return; | |||
| } | |||
| for(int i = 0; i < attributes.length; i++) { | |||
| if ( getAttributes().getNamedItem(attributes[i]) == null) { | |||
| // XXX should set to default? | |||
| setAttribute(attributes[i], ""); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Returns the DTD element we represent | |||
| */ | |||
| private ACSDocumentType.DtdElement getDtdElement() { | |||
| if (_dtdElement != null) { | |||
| return _dtdElement; | |||
| } | |||
| String name = getNodeName(); | |||
| _dtdElement = docType.findElement(name); | |||
| return _dtdElement; | |||
| } | |||
| } | |||