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). | ||||