package jadex.tools.common.modeltree;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
/**
* Model of the explorer tree, which gets dynamically
* filled by the node functionalities.
*/
public class ModelExplorerTreeModel implements TreeModel
{
//-------- attributes --------
/** The root node. */
protected RootNode root;
/** The node functionality. */
protected DefaultNodeFunctionality nof;
/** The listeners. */
protected List listeners;
//-------- constructors --------
/**
* Create a new explorer tree model.
*/
public ModelExplorerTreeModel(RootNode root, DefaultNodeFunctionality nof)
{
this.root = root;
this.nof = nof;
}
//-------- TreeModel interface --------
public Object getChild(Object parent, int index)
{
Object ret;
if(parent instanceof FileNode)
{
List children = nof.getChildren((FileNode)parent);
if(children!=null)
ret = children.get(index);
else
throw new ArrayIndexOutOfBoundsException(index);
}
else
{
ret = ((RootNode)parent).getChildAt(index);
}
return ret;
}
public int getChildCount(Object parent)
{
int ret;
if(parent instanceof FileNode)
{
List children = nof.getChildren((FileNode)parent);
ret = children!=null ? children.size() : 0;
}
else
{
ret = ((RootNode)parent).getChildCount();
}
return ret;
}
public int getIndexOfChild(Object parent, Object child)
{
int ret = -1;
if(parent instanceof FileNode)
{
List children = nof.getChildren((FileNode)parent);
if(children!=null)
ret = children.indexOf(child);
}
else
{
ret = ((RootNode)parent).getIndex((IExplorerTreeNode) child);
}
return ret;
}
public Object getRoot()
{
return root;
}
public boolean isLeaf(Object node)
{
return getChildCount(node)==0;
}
public void addTreeModelListener(TreeModelListener l)
{
if(listeners==null)
listeners = new ArrayList();
listeners.add(l);
}
public void removeTreeModelListener(TreeModelListener l)
{
if(listeners!=null && listeners.remove(l) && listeners.isEmpty())
listeners = null;
}
public void valueForPathChanged(TreePath path, Object newValue)
{
// manipulation of nodes not supported / required
}
//-------- event methods --------
/**
* A node has changed.
*/
public void fireNodeChanged(IExplorerTreeNode node)
{
if(listeners!=null)
{
TreeModelEvent event = new TreeModelEvent(this, getPathForNode(node));
for(int i=0; i<listeners.size(); i++)
{
((TreeModelListener)listeners.get(i)).treeNodesChanged(event);
}
}
}
/**
* A node was added.
*/
public void fireNodeAdded(IExplorerTreeNode parent, IExplorerTreeNode child, int index)
{
if(listeners!=null)
{
if(parent instanceof RootNode)
{
// Hack!!! Tree will not update changes of root node, if root node is not visible!?
fireTreeStructureChanged(parent);
}
else
{
TreeModelEvent event = new TreeModelEvent(this, getPathForNode(parent), new int[]{index}, new Object[]{child});
for(int i=0; i<listeners.size(); i++)
{
((TreeModelListener)listeners.get(i)).treeNodesInserted(event);
}
}
}
}
/**
* A node was removed.
*/
public void fireNodeRemoved(IExplorerTreeNode parent, IExplorerTreeNode child, int index)
{
if(listeners!=null)
{
if(parent instanceof RootNode)
{
// Hack!!! Tree will not update changes of root node, if root node is not visible!?
fireTreeStructureChanged(parent);
}
else
{
TreeModelEvent event = new TreeModelEvent(this, getPathForNode(parent), new int[]{index}, new Object[]{child});
for(int i=0; i<listeners.size(); i++)
{
((TreeModelListener)listeners.get(i)).treeNodesRemoved(event);
}
}
}
}
/**
* Structure below a node has changed.
*/
public void fireTreeStructureChanged(IExplorerTreeNode node)
{
if(listeners!=null)
{
TreeModelEvent event = new TreeModelEvent(this, getPathForNode(node));
for(int i=0; i<listeners.size(); i++)
{
((TreeModelListener)listeners.get(i)).treeStructureChanged(event);
}
}
}
/**
* Set a new root node for the tree.
*/
public void setRoot(RootNode root)
{
this.root = root;
// fireTreeStructureChanged(root); // Done outside.
}
/**
* Get the path for a node.
*/
public Object[] getPathForNode(IExplorerTreeNode node)
{
List path = new LinkedList();
while(node!=null)
{
path.add(0, node);
node = node.getParent();
}
return path.toArray();
}
}