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.