package jas2.util.tree;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import java.io.*;
import java.util.Comparator;
/**
* A tree model built from a collection of SimpleNodes
*/
public class SimpleTreeModel implements TreeModel
{
public SimpleTreeModel(SimpleNode root)
{
m_root = root;
}
public Object getRoot()
{
return m_root;
}
public int getChildCount(Object parent)
{
SimpleNode p = (SimpleNode) parent;
return p.getChildCount();
}
public Object getChild(Object parent,int index)
{
SimpleNode p = (SimpleNode) parent;
return p.getChild(index);
}
public int getIndexOfChild(Object parent, Object child)
{
SimpleNode p = (SimpleNode) parent;
return p.getIndexOfChild((SimpleNode) child);
}
public boolean isLeaf(Object node)
{
return getChildCount(node) == 0; // For now
}
public void valueForPathChanged(TreePath path,Object newValue)
{
// This is called if the GUI tries to change the items in the tree.
// Currently we ignore it.
}
/**
* Adds a listener for the TreeModelEvent posted after the tree changes.
*
* @see #removeTreeModelListener
* @param l the listener to add
*/
public void addTreeModelListener(TreeModelListener l) {
listenerList.add(TreeModelListener.class, l);
if (m_nodeListener == null)
{
m_nodeListener = new SimpleListener();
m_root.addNodeListener(m_nodeListener);
}
}
/**
* Removes a listener previously added with addTreeModelListener().
*
* @see #addTreeModelListener
* @param l the listener to remove
*/
public void removeTreeModelListener(TreeModelListener l) {
listenerList.remove(TreeModelListener.class, l);
if (listenerList.getListenerCount() == 0)
{
m_root.removeNodeListener(m_nodeListener);
m_nodeListener = null;
}
}
protected void fireTreeNodesInserted(TreeModelEvent e)
{
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==TreeModelListener.class) {
((TreeModelListener)listeners[i+1]).treeNodesInserted(e);
}
}
}
protected void fireTreeNodesRemoved(TreeModelEvent e)
{
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==TreeModelListener.class) {
((TreeModelListener)listeners[i+1]).treeNodesRemoved(e);
}
}
}
protected void fireTreeStructureChanged(TreeModelEvent e)
{
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==TreeModelListener.class) {
((TreeModelListener)listeners[i+1]).treeStructureChanged(e);
}
}
}
private EventListenerList listenerList = new EventListenerList();
private SimpleNode m_root;
private SimpleNodeListener m_nodeListener;
private class SimpleListener implements SimpleNodeListener
{
public void treeChanged(TreeItem item)
{
if ((item.flags & STRUCTURE_CHANGED) != 0) structureChanged(item);
else nodesChanged(item);
}
private void nodesChanged(TreeItem item)
{
// Create the TreeModelEvent
Object[] path = new SimpleNode[item.path.length];
SimpleNode parent = m_root;
SimpleNode child = parent;
for (int i=0;;)
{
path[i] = parent;
child = parent.findChild(item.path[i++]);
if (i == path.length) break;
parent = child;
}
Object[] children = { child };
int[] index = { parent.getIndexOfChild(child) };
TreeModelEvent e = new TreeModelEvent(this,new TreePath(path),index,children);
if ((item.flags & item.DELETED) != 0) fireTreeNodesRemoved(e);
else fireTreeNodesInserted(e);
}
public void structureChanged(TreeItem item)
{
// Create the TreeModelEvent
Object[] path = new SimpleNode[item.path.length+1];
SimpleNode node = m_root;
for (int i=0;;i++)
{
path[i] = node;
if (i >= item.path.length) break;
node = node.findChild(item.path[i]);
}
TreeModelEvent e = new TreeModelEvent(this,new TreePath(path));
fireTreeStructureChanged(e);
}
}
public static void main(String[] argv)
{
// Build a test tree
File dir = new File(System.getProperties().getProperty("user.home"));
OrderedNode root = new OrderedNode();
root.setOrder(new FolderComparator());
SimpleNode here = new OrderedNode(root,dir.getName(),null,TreeItem.FOLDER,dir);
listFiles(here,dir);
JFrame frame = new JFrame();
frame.setContentPane(new JScrollPane(new JTree(new SimpleTreeModel(root))));
frame.setSize(400,400);
frame.show();
}
private static void listFiles(SimpleNode root, File dir)
{
String[] files = dir.list();
for (int i=0; i
Ads help maintain this website.