Browse Source

Started rewrite of tree model to remove ACS dependency on TreeNode.

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268442 13f79535-47bb-0310-9956-ffa450edef68
master
metasim 24 years ago
parent
commit
c71214044f
7 changed files with 259 additions and 130 deletions
  1. +1
    -119
      src/antidote/org/apache/tools/ant/gui/acs/ACSTreeNodeElement.java
  2. +153
    -4
      src/antidote/org/apache/tools/ant/gui/acs/ElementTreeModel.java
  3. +4
    -6
      src/antidote/org/apache/tools/ant/gui/command/NewProjectCmd.java
  4. +95
    -0
      src/antidote/org/apache/tools/ant/gui/command/NewTargetCmd.java
  5. +2
    -1
      src/antidote/org/apache/tools/ant/gui/modules/edit/ElementTreeCellRenderer.java
  6. +3
    -0
      src/antidote/org/apache/tools/ant/gui/resources/action.properties
  7. +1
    -0
      src/antidote/org/apache/tools/ant/gui/resources/antidote.properties

+ 1
- 119
src/antidote/org/apache/tools/ant/gui/acs/ACSTreeNodeElement.java View File

@@ -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++);
}

}
} }

+ 153
- 4
src/antidote/org/apache/tools/ant/gui/acs/ElementTreeModel.java View File

@@ -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);
}

} }

+ 4
- 6
src/antidote/org/apache/tools/ant/gui/command/NewProjectCmd.java View File

@@ -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();


+ 95
- 0
src/antidote/org/apache/tools/ant/gui/command/NewTargetCmd.java View File

@@ -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 }));
}
}

+ 2
- 1
src/antidote/org/apache/tools/ant/gui/modules/edit/ElementTreeCellRenderer.java View File

@@ -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());
} }


+ 3
- 0
src/antidote/org/apache/tools/ant/gui/resources/action.properties View File

@@ -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

+ 1
- 0
src/antidote/org/apache/tools/ant/gui/resources/antidote.properties View File

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


Loading…
Cancel
Save