/**************************************************************
 * 
 * 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.Node;
import org.w3c.dom.Attr;
import org.w3c.dom.NamedNodeMap;


/*
 * This class wraps a DOM node and returns the text we want to
 * display in the tree. It also returns children, index values,
 * and child counts.
 */
class AdapterNode 
{ 
	private Node m_domNode;
	static final int ELEMENT_TYPE =   Node.ELEMENT_NODE;
	
	/*
	 * An array of names for DOM node-types
	 */
	static final String[] typeName = {
		"none",
		"Element",
		"Attr",
		"Text",
		"CDATA",
		"EntityRef",
		"Entity",
		"ProcInstr",
		"Comment",
		"Document",
		"DocType",
		"DocFragment",
		"Notation",
		};
	
	protected Node getNode()
	{
		return m_domNode;
	}
	
	/*
	 * Construct an Adapter node from a DOM node
	 */
	protected AdapterNode(org.w3c.dom.Node node) 
	{
		m_domNode = node;
	}
	
	/*
	 * Return children, index, and count values
	 */
	protected int index(AdapterNode child) 
	{
		int count = childCount();
		for (int i=0; i<count; ++i) 
		{
			AdapterNode n = this.child(i);
			if (child.m_domNode == n.m_domNode) return i;
		}
		return -1;
	}
	
	protected AdapterNode child(int searchIndex) 
	{
		if (m_domNode == null) return null;
		
		/*
		 * Note: JTree index is zero-based. 
		 */
		org.w3c.dom.Node node = 
			m_domNode.getChildNodes().item(searchIndex);
			
		return new AdapterNode(node); 
	}
	
	protected int childCount() 
	{
		int rc = 0;
		
		if (m_domNode != null)
		{
			rc = m_domNode.getChildNodes().getLength();
		}
		
		return rc;
	}
	
	/*
	 * Return a string that identifies this node in the tree
	 */
	public String toString() 
	{
		String rc = null;
		
		if (m_domNode != null)
		{
			String s = typeName[m_domNode.getNodeType()];
			String nodeName = m_domNode.getNodeName();
			
			if (! nodeName.startsWith("#")) 
			{
				s += ": " + nodeName;
			}
			
			if (m_domNode.getNodeValue() != null) 
			{
				if (s.startsWith("ProcInstr")) 
				{
					s += ", "; 
				}
				else 
				{
					s += ": ";
				}
				
				String t = m_domNode.getNodeValue();
				s += t;
			}
			
			if (m_domNode.getNodeType() == ELEMENT_TYPE)
			{
				NamedNodeMap attrs = m_domNode.getAttributes();
				
				int length = attrs.getLength();
				for (int i=0; i<length; ++i)
				{
					Attr attr = (Attr)(attrs.item(i));
					s += " "+ attr.getName()+"='"+attr.getValue() + "'"; 
				}
			}
			rc = s;
		}
		
		return rc;
	}
}

