/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/



package com.sun.star.xml.security.uno;

import org.w3c.dom.Document;
import javax.swing.event.TreeModelListener;
import javax.swing.event.TreeModelEvent;
import javax.swing.tree.TreePath;
import java.util.Enumeration;
import java.util.Vector;

/*
 * This adapter converts the current Document (a DOM) into
 * a JTree model.
 */
class DomToTreeModelAdapter
	implements javax.swing.tree.TreeModel
{
	private Document m_document;
	private Vector m_listenerList = new Vector();

	public DomToTreeModelAdapter(Document document)
	{
		m_document = document;
	}

	/*
	 * Basic TreeModel operations
	 */
	public Object  getRoot()
	{
		return new AdapterNode(m_document);
	}

	public boolean isLeaf(Object aNode)
	{
		boolean rc = true;

		/*
		 * Determines whether the icon shows up to the left.
		 * Return true for any node with no children.
		 */
		AdapterNode node = (AdapterNode) aNode;

		if (node.childCount() > 0)
		{
			rc = false;
		}

		return rc;
	}

	public int getChildCount(Object parent)
	{
		AdapterNode node = (AdapterNode) parent;
		return node.childCount();
	}

	public Object getChild(Object parent, int index)
	{
		AdapterNode node = (AdapterNode) parent;
		return node.child(index);
	}

	public int getIndexOfChild(Object parent, Object child)
	{
		AdapterNode node = (AdapterNode) parent;
		return node.index((AdapterNode) child);
	}

	public void valueForPathChanged(TreePath path, Object newValue)
	{
		/*
		 * Null. We won't be making changes in the GUI
		 * If we did, we would ensure the new value was really new,
		 * adjust the model, and then fire a TreeNodesChanged event.
		 */
	}

	public void addTreeModelListener(TreeModelListener listener)
	{
		if ( listener != null
			&& ! m_listenerList.contains( listener ) )
		{
			m_listenerList.addElement( listener );
		}
	}

	public void removeTreeModelListener(TreeModelListener listener)
	{
		if ( listener != null )
		{
			m_listenerList.removeElement( listener );
		}
	}

	public void fireTreeNodesChanged( TreeModelEvent e )
	{
		Enumeration listeners = m_listenerList.elements();
		while ( listeners.hasMoreElements() )
		{
			TreeModelListener listener =
			(TreeModelListener) listeners.nextElement();
			listener.treeNodesChanged( e );
		}
	}

	public void fireTreeNodesInserted( TreeModelEvent e )
	{
		Enumeration listeners = m_listenerList.elements();
		while ( listeners.hasMoreElements() )
		{
			TreeModelListener listener =
			(TreeModelListener) listeners.nextElement();
			listener.treeNodesInserted( e );
		}
	}

	public void fireTreeNodesRemoved( TreeModelEvent e )
	{
		Enumeration listeners = m_listenerList.elements();
		while ( listeners.hasMoreElements() )
		{
			TreeModelListener listener =
			(TreeModelListener) listeners.nextElement();
			listener.treeNodesRemoved( e );
		}
	}

	public void fireTreeStructureChanged( TreeModelEvent e )
	{
		Enumeration listeners = m_listenerList.elements();
		while ( listeners.hasMoreElements() )
		{
			TreeModelListener listener =
			(TreeModelListener) listeners.nextElement();
			listener.treeStructureChanged( e );
		}
	}
}
