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