git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268442 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -66,124 +66,6 @@ import java.util.*; | |||||
| * @version $Revision$ | * @version $Revision$ | ||||
| * @author Simeon Fitch | * @author Simeon Fitch | ||||
| */ | */ | ||||
| public abstract class ACSTreeNodeElement extends ACSElement | |||||
| implements TreeNode { | |||||
| public abstract class ACSTreeNodeElement extends ACSElement { | |||||
| /** Cache of TreeNode only children. */ | |||||
| private List _treeNodeCache = null; | |||||
| /** | |||||
| * Get the cache of TreeNode only children. | |||||
| * | |||||
| * @return List of TreeNodes that are children. | |||||
| */ | |||||
| private List getCache() { | |||||
| if(_treeNodeCache == null) { | |||||
| _treeNodeCache = new ArrayList(); | |||||
| // XXX this crazy casting is to get around an | |||||
| // inconsistency between jikes and javac whereby | |||||
| // the call without this cast when compiled with | |||||
| // jikes causes an IllegalAccessException | |||||
| // because the implementation of getLength() and | |||||
| // item() are actually in a package only class | |||||
| // in the Sun implementation classes. | |||||
| int len = ((NodeList)this).getLength(); | |||||
| for(int i = 0; i < len; i++) { | |||||
| Object n = ((NodeList)this).item(i); | |||||
| if(n instanceof TreeNode) { | |||||
| _treeNodeCache.add(n); | |||||
| } | |||||
| } | |||||
| } | |||||
| return _treeNodeCache; | |||||
| } | |||||
| /** | |||||
| * Returns the child <code>TreeNode</code> at index | |||||
| * <code>childIndex</code>. | |||||
| */ | |||||
| public TreeNode getChildAt(int childIndex) { | |||||
| List nodes = getCache(); | |||||
| return (TreeNode) nodes.get(childIndex); | |||||
| } | |||||
| /** | |||||
| * Returns the number of children <code>TreeNode</code>s the receiver | |||||
| * contains. | |||||
| */ | |||||
| public int getChildCount() { | |||||
| List nodes = getCache(); | |||||
| return nodes.size(); | |||||
| } | |||||
| /** | |||||
| * Returns the parent <code>TreeNode</code> of the receiver. | |||||
| */ | |||||
| public TreeNode getParent() { | |||||
| // XXX this barfs becase a different "getParent()" is in Node | |||||
| // interface. Need to fix... | |||||
| return (TreeNode) getParent(); | |||||
| } | |||||
| /** | |||||
| * Returns the index of <code>node</code> in the receivers children. | |||||
| * If the receiver does not contain <code>node</code>, -1 will be | |||||
| * returned. | |||||
| */ | |||||
| public int getIndex(TreeNode node) { | |||||
| List nodes = getCache(); | |||||
| return nodes.indexOf(node); | |||||
| } | |||||
| /** | |||||
| * Returns true if the receiver allows children. | |||||
| */ | |||||
| public boolean getAllowsChildren() { | |||||
| return true; | |||||
| } | |||||
| /** | |||||
| * Returns true if the receiver is a leaf. | |||||
| */ | |||||
| public boolean isLeaf() { | |||||
| List nodes = getCache(); | |||||
| return nodes.size() <= 0; | |||||
| } | |||||
| /** | |||||
| * Returns the children of the reciever as an Enumeration. | |||||
| */ | |||||
| public Enumeration children() { | |||||
| return new NodeEnum(); | |||||
| } | |||||
| /** Internal iterator for the child nodes. */ | |||||
| private class NodeEnum implements Enumeration { | |||||
| /** Current child index. */ | |||||
| private int _index = 0; | |||||
| /** | |||||
| * Determine if there are more elements to visit. | |||||
| * | |||||
| * @return True if nextElement() can be called, false otherwise. | |||||
| */ | |||||
| public boolean hasMoreElements() { | |||||
| List nodes = getCache(); | |||||
| return _index < nodes.size(); | |||||
| } | |||||
| /** | |||||
| * Get the next element. hasMoreElements() must currently return true. | |||||
| * | |||||
| * @return Next element | |||||
| */ | |||||
| public Object nextElement() { | |||||
| List nodes = getCache(); | |||||
| return nodes.get(_index++); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| @@ -54,9 +54,13 @@ | |||||
| package org.apache.tools.ant.gui.acs; | package org.apache.tools.ant.gui.acs; | ||||
| import javax.swing.tree.DefaultTreeModel; | |||||
| import javax.swing.tree.*; | |||||
| import javax.swing.event.TreeModelListener; | |||||
| import javax.swing.event.TreeModelEvent; | |||||
| import org.w3c.dom.Node; | |||||
| import org.w3c.dom.NodeList; | |||||
| import org.apache.tools.ant.gui.acs.ACSProjectElement; | import org.apache.tools.ant.gui.acs.ACSProjectElement; | ||||
| import java.util.*; | |||||
| /** | /** | ||||
| * Provides a tree model view of the Project class. XXX This | * Provides a tree model view of the Project class. XXX This | ||||
| @@ -64,8 +68,153 @@ import org.apache.tools.ant.gui.acs.ACSProjectElement; | |||||
| * | * | ||||
| * @version $Revision$ | * @version $Revision$ | ||||
| * @author Simeon H.K. Fitch */ | * @author Simeon H.K. Fitch */ | ||||
| public class ElementTreeModel extends DefaultTreeModel { | |||||
| public class ElementTreeModel implements TreeModel { | |||||
| /** Root of the tree. */ | |||||
| private ACSProjectElement _root = null; | |||||
| /** List of listeners. */ | |||||
| private List _listeners = new ArrayList(); | |||||
| public ElementTreeModel(ACSProjectElement root) { | public ElementTreeModel(ACSProjectElement root) { | ||||
| super(root); | |||||
| _root = root; | |||||
| } | |||||
| /** | |||||
| * Returns the root of the tree. Returns null only if the tree has | |||||
| * no nodes. | |||||
| * | |||||
| * @return the root of the tree | |||||
| */ | |||||
| public Object getRoot() { | |||||
| return _root; | |||||
| } | |||||
| /** | |||||
| * Gets the set of children that this tree model is interested in. | |||||
| * | |||||
| * @param parent Parent to extract children from. | |||||
| */ | |||||
| private List getChildren(Node parent) { | |||||
| NodeList children = parent.getChildNodes(); | |||||
| int length = children.getLength(); | |||||
| List retval = new ArrayList(length); | |||||
| for(int i = 0; i < length; i++) { | |||||
| // XXX This is where we will eventually add dynamic filtering | |||||
| // capabilities. | |||||
| Node n = children.item(i); | |||||
| if(n instanceof ACSTreeNodeElement) { | |||||
| retval.add(n); | |||||
| } | |||||
| } | |||||
| return retval; | |||||
| } | |||||
| /** | |||||
| * Returns the child of <I>parent</I> at index <I>index</I> in the parent's | |||||
| * child array. <I>parent</I> must be a node previously obtained from | |||||
| * this data source. This should not return null if <i>index</i> | |||||
| * is a valid index for <i>parent</i> (that is <i>index</i> >= 0 && | |||||
| * <i>index</i> < getChildCount(<i>parent</i>)). | |||||
| * | |||||
| * @param parent a node in the tree, obtained from this data source | |||||
| * @return the child of <I>parent</I> at index <I>index</I> | |||||
| */ | |||||
| public Object getChild(Object parent, int index) { | |||||
| if(parent instanceof Node) { | |||||
| Node n = (Node) parent; | |||||
| return getChildren(n).get(index); | |||||
| } | |||||
| else { | |||||
| return null; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Returns the number of children of <I>parent</I>. Returns 0 if the node | |||||
| * is a leaf or if it has no children. <I>parent</I> must be a node | |||||
| * previously obtained from this data source. | |||||
| * | |||||
| * @param parent a node in the tree, obtained from this data source | |||||
| * @return the number of children of the node <I>parent</I> | |||||
| */ | |||||
| public int getChildCount(Object parent) { | |||||
| if(parent instanceof Node) { | |||||
| Node n = (Node) parent; | |||||
| return getChildren(n).size(); | |||||
| } | |||||
| else { | |||||
| return 0; | |||||
| } | |||||
| } | } | ||||
| /** | |||||
| * Returns true if <I>node</I> is a leaf. It is possible for this method | |||||
| * to return false even if <I>node</I> has no children. A directory in a | |||||
| * filesystem, for example, may contain no files; the node representing | |||||
| * the directory is not a leaf, but it also has no children. | |||||
| * | |||||
| * @param node a node in the tree, obtained from this data source | |||||
| * @return true if <I>node</I> is a leaf | |||||
| */ | |||||
| public boolean isLeaf(Object node) { | |||||
| if(node instanceof Node) { | |||||
| Node n = (Node) node; | |||||
| return getChildren(n).size() == 0; | |||||
| } | |||||
| else { | |||||
| return true; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Returns the index of child in parent. | |||||
| */ | |||||
| public int getIndexOfChild(Object parent, Object child) { | |||||
| if(parent instanceof Node && child instanceof Node) { | |||||
| Node n = (Node) parent; | |||||
| List children = getChildren(n); | |||||
| int count = children.size(); | |||||
| for(int i = 0; i < count; i++) { | |||||
| if(children.get(i) == child) return i; | |||||
| } | |||||
| } | |||||
| return -1; | |||||
| } | |||||
| /** | |||||
| * Messaged when the user has altered the value for the item identified | |||||
| * by <I>path</I> to <I>newValue</I>. If <I>newValue</I> signifies | |||||
| * a truly new value the model should post a treeNodesChanged | |||||
| * event. | |||||
| * | |||||
| * @param path path to the node that the user has altered. | |||||
| * @param newValue the new value from the TreeCellEditor. | |||||
| */ | |||||
| public void valueForPathChanged(TreePath path, Object newValue) { | |||||
| } | |||||
| /** | |||||
| * Adds a listener for the TreeModelEvent posted after the tree changes. | |||||
| * | |||||
| * @see #removeTreeModelListener | |||||
| * @param l the listener to add | |||||
| */ | |||||
| public void addTreeModelListener(TreeModelListener l) { | |||||
| _listeners.add(l); | |||||
| } | |||||
| /** | |||||
| * Removes a listener previously added with <B>addTreeModelListener()</B>. | |||||
| * | |||||
| * @see #addTreeModelListener | |||||
| * @param l the listener to remove | |||||
| */ | |||||
| public void removeTreeModelListener(TreeModelListener l) { | |||||
| _listeners.remove(l); | |||||
| } | |||||
| } | } | ||||
| @@ -76,12 +76,10 @@ public class NewProjectCmd extends AbstractCommand { | |||||
| super(context); | super(context); | ||||
| } | } | ||||
| /** | |||||
| * Display a dialog asking the user to select a file to open. | |||||
| * If one is selected then an event is posted requesting the open | |||||
| * operation be completed. | |||||
| * | |||||
| */ | |||||
| /** | |||||
| * Create a new project and make it active. | |||||
| * | |||||
| */ | |||||
| public void run() { | public void run() { | ||||
| ACSProjectElement project = | ACSProjectElement project = | ||||
| getContext().getProjectManager().createNew(); | getContext().getProjectManager().createNew(); | ||||
| @@ -0,0 +1,95 @@ | |||||
| /* | |||||
| * 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 | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.gui.command; | |||||
| import org.apache.tools.ant.gui.core.AppContext; | |||||
| import org.apache.tools.ant.gui.event.TargetSelectionEvent; | |||||
| import org.apache.tools.ant.gui.acs.*; | |||||
| /** | |||||
| * Command for creating a new target. | |||||
| * | |||||
| * @version $Revision$ | |||||
| * @author Simeon Fitch | |||||
| */ | |||||
| public class NewTargetCmd extends AbstractCommand { | |||||
| /** New project count for this session. Used to create default names, | |||||
| * numbered as a convenience. */ | |||||
| private static int _count = 1; | |||||
| /** | |||||
| * Standard ctor. | |||||
| * | |||||
| * @param context Application context. | |||||
| */ | |||||
| public NewTargetCmd(AppContext context) { | |||||
| super(context); | |||||
| } | |||||
| /** | |||||
| * Create a new target and make it active. | |||||
| * | |||||
| */ | |||||
| public void run() { | |||||
| ACSProjectElement project = getContext().getSelectionManager(). | |||||
| getSelectedProject(); | |||||
| ACSTargetElement retval = | |||||
| ACSFactory.getInstance().createTarget(project); | |||||
| retval.setName(getContext().getResources(). | |||||
| getString(getClass(), "defName") + " " + _count++); | |||||
| getContext().getEventBus().postEvent( | |||||
| new TargetSelectionEvent( | |||||
| getContext(), new ACSElement[] { retval })); | |||||
| } | |||||
| } | |||||
| @@ -82,7 +82,8 @@ public class ElementTreeCellRenderer extends DefaultTreeCellRenderer { | |||||
| try { | try { | ||||
| BeanInfo info = Introspector.getBeanInfo(value.getClass()); | BeanInfo info = Introspector.getBeanInfo(value.getClass()); | ||||
| Image icon = info.getIcon(BeanInfo.ICON_COLOR_16x16); | Image icon = info.getIcon(BeanInfo.ICON_COLOR_16x16); | ||||
| setIcon(new ImageIcon(icon)); | |||||
| setIcon(icon == null ? null : new ImageIcon(icon)); | |||||
| if(value instanceof ACSElement) { | if(value instanceof ACSElement) { | ||||
| setText(((ACSElement)value).getDisplayName()); | setText(((ACSElement)value).getDisplayName()); | ||||
| } | } | ||||
| @@ -111,6 +111,7 @@ newTarget.shortDescription=Create a new target | |||||
| newTarget.icon=new-target.gif | newTarget.icon=new-target.gif | ||||
| newTarget.enabled=false | newTarget.enabled=false | ||||
| newTarget.separator=true | newTarget.separator=true | ||||
| newTarget.command=org.apache.tools.ant.gui.command.NewTargetCmd | |||||
| newTarget.enableOn=\ | newTarget.enableOn=\ | ||||
| org.apache.tools.ant.gui.event.ProjectSelectedEvent, \ | org.apache.tools.ant.gui.event.ProjectSelectedEvent, \ | ||||
| org.apache.tools.ant.gui.event.NewProjectEvent | org.apache.tools.ant.gui.event.NewProjectEvent | ||||
| @@ -118,6 +119,7 @@ newTarget.disableOn=\ | |||||
| org.apache.tools.ant.gui.event.TargetSelectionEvent, \ | org.apache.tools.ant.gui.event.TargetSelectionEvent, \ | ||||
| org.apache.tools.ant.gui.event.TaskSelectionEvent, \ | org.apache.tools.ant.gui.event.TaskSelectionEvent, \ | ||||
| org.apache.tools.ant.gui.event.PropertySelectionEvent, \ | 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 | ||||
| newTask.name=New Task | newTask.name=New Task | ||||
| @@ -143,4 +145,5 @@ newProperty.enableOn=\ | |||||
| org.apache.tools.ant.gui.event.TaskSelectionEvent | org.apache.tools.ant.gui.event.TaskSelectionEvent | ||||
| newProperty.disableOn=\ | newProperty.disableOn=\ | ||||
| org.apache.tools.ant.gui.event.PropertySelectionEvent, \ | 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 | ||||
| @@ -93,6 +93,7 @@ org.apache.tools.ant.gui.acs.ACSTaskElementBeanInfo.icon=task.gif | |||||
| org.apache.tools.ant.gui.command.NewProjectCmd.defName=New Project | org.apache.tools.ant.gui.command.NewProjectCmd.defName=New Project | ||||
| org.apache.tools.ant.gui.command.NewTargetCmd.defName=New Target | |||||
| #---------------------------------------------------------------------------- | #---------------------------------------------------------------------------- | ||||
| # About Description (NB: this is only a temporary approach). | # About Description (NB: this is only a temporary approach). | ||||