diff --git a/src/antidote/org/apache/tools/ant/gui/acs/ACSTreeNodeElement.java b/src/antidote/org/apache/tools/ant/gui/acs/ACSTreeNodeElement.java index 95b1ebe2c..70c1f020e 100644 --- a/src/antidote/org/apache/tools/ant/gui/acs/ACSTreeNodeElement.java +++ b/src/antidote/org/apache/tools/ant/gui/acs/ACSTreeNodeElement.java @@ -66,124 +66,6 @@ import java.util.*; * @version $Revision$ * @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 TreeNode at index - * childIndex. - */ - public TreeNode getChildAt(int childIndex) { - List nodes = getCache(); - return (TreeNode) nodes.get(childIndex); - } - - /** - * Returns the number of children TreeNodes the receiver - * contains. - */ - public int getChildCount() { - List nodes = getCache(); - return nodes.size(); - } - - /** - * Returns the parent TreeNode 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 node in the receivers children. - * If the receiver does not contain node, -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++); - } - - } } diff --git a/src/antidote/org/apache/tools/ant/gui/acs/ElementTreeModel.java b/src/antidote/org/apache/tools/ant/gui/acs/ElementTreeModel.java index 74442daaa..30ad5eaf0 100644 --- a/src/antidote/org/apache/tools/ant/gui/acs/ElementTreeModel.java +++ b/src/antidote/org/apache/tools/ant/gui/acs/ElementTreeModel.java @@ -54,9 +54,13 @@ 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 java.util.*; /** * 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$ * @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) { - 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 parent at index index in the parent's + * child array. parent must be a node previously obtained from + * this data source. This should not return null if index + * is a valid index for parent (that is index >= 0 && + * index < getChildCount(parent)). + * + * @param parent a node in the tree, obtained from this data source + * @return the child of parent at index index + */ + 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 parent. Returns 0 if the node + * is a leaf or if it has no children. parent 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 parent + */ + public int getChildCount(Object parent) { + if(parent instanceof Node) { + Node n = (Node) parent; + return getChildren(n).size(); + } + else { + return 0; + } } + + /** + * Returns true if node is a leaf. It is possible for this method + * to return false even if node 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 node 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 path to newValue. If newValue 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 addTreeModelListener(). + * + * @see #addTreeModelListener + * @param l the listener to remove + */ + public void removeTreeModelListener(TreeModelListener l) { + _listeners.remove(l); + } + } diff --git a/src/antidote/org/apache/tools/ant/gui/command/NewProjectCmd.java b/src/antidote/org/apache/tools/ant/gui/command/NewProjectCmd.java index e2ca6b484..f43d78e7c 100644 --- a/src/antidote/org/apache/tools/ant/gui/command/NewProjectCmd.java +++ b/src/antidote/org/apache/tools/ant/gui/command/NewProjectCmd.java @@ -76,12 +76,10 @@ public class NewProjectCmd extends AbstractCommand { 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() { ACSProjectElement project = getContext().getProjectManager().createNew(); diff --git a/src/antidote/org/apache/tools/ant/gui/command/NewTargetCmd.java b/src/antidote/org/apache/tools/ant/gui/command/NewTargetCmd.java new file mode 100644 index 000000000..e257d49db --- /dev/null +++ b/src/antidote/org/apache/tools/ant/gui/command/NewTargetCmd.java @@ -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 + * . + */ +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 })); + + } +} diff --git a/src/antidote/org/apache/tools/ant/gui/modules/edit/ElementTreeCellRenderer.java b/src/antidote/org/apache/tools/ant/gui/modules/edit/ElementTreeCellRenderer.java index 5397ed43b..a948496a6 100644 --- a/src/antidote/org/apache/tools/ant/gui/modules/edit/ElementTreeCellRenderer.java +++ b/src/antidote/org/apache/tools/ant/gui/modules/edit/ElementTreeCellRenderer.java @@ -82,7 +82,8 @@ public class ElementTreeCellRenderer extends DefaultTreeCellRenderer { try { BeanInfo info = Introspector.getBeanInfo(value.getClass()); Image icon = info.getIcon(BeanInfo.ICON_COLOR_16x16); - setIcon(new ImageIcon(icon)); + setIcon(icon == null ? null : new ImageIcon(icon)); + if(value instanceof ACSElement) { setText(((ACSElement)value).getDisplayName()); } 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 298466a2a..2258fa4eb 100644 --- a/src/antidote/org/apache/tools/ant/gui/resources/action.properties +++ b/src/antidote/org/apache/tools/ant/gui/resources/action.properties @@ -111,6 +111,7 @@ newTarget.shortDescription=Create a new target newTarget.icon=new-target.gif newTarget.enabled=false newTarget.separator=true +newTarget.command=org.apache.tools.ant.gui.command.NewTargetCmd newTarget.enableOn=\ org.apache.tools.ant.gui.event.ProjectSelectedEvent, \ 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.TaskSelectionEvent, \ org.apache.tools.ant.gui.event.PropertySelectionEvent, \ + org.apache.tools.ant.gui.event.ProjectClosedEvent, \ org.apache.tools.ant.gui.event.NullSelectionEvent newTask.name=New Task @@ -143,4 +145,5 @@ newProperty.enableOn=\ org.apache.tools.ant.gui.event.TaskSelectionEvent newProperty.disableOn=\ org.apache.tools.ant.gui.event.PropertySelectionEvent, \ + org.apache.tools.ant.gui.event.ProjectClosedEvent, \ org.apache.tools.ant.gui.event.NullSelectionEvent 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 f0ab1d10a..5dcd7052e 100644 --- a/src/antidote/org/apache/tools/ant/gui/resources/antidote.properties +++ b/src/antidote/org/apache/tools/ant/gui/resources/antidote.properties @@ -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.NewTargetCmd.defName=New Target #---------------------------------------------------------------------------- # About Description (NB: this is only a temporary approach).