/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	レイアウト情報定義クラス
//
//		変更履歴
//			2005.02.19  新規作成  村上 靖征
//
//	機能
//
//	このクラスはレイアウト情報を定義するクラスです。
//
////////////////////////////////////////////////////////////////

package jp.co.ntt.lms.xmf;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.w3c.dom.Node;

/**
 *  レイアウト情報定義クラス
 * 
 *  このクラスはフレームのレイアウト情報を定義するクラスです。
 * 
 *  @author 村上 靖征
 *  @version 1.0
 */
public class LayoutElement implements Serializable {

	protected Node layout;
	
	/**
	 * レイアウト情報を読み込む。
	 * 
	 * @param node ノード
	 */
	public void loadLayout(Node node)
	{
		layout = node;
	}

	/**
	 * name属性値を返す。
	 * 
	 * @return name属性値
	 */
	public String getName()
	{
		return NodeUtil.getAttribute(layout, "name");
	}
	
	/**
	 * resource属性値を返す
	 * 
	 * @return resource属性値
	 */
	public String getResource()
	{
		return NodeUtil.getAttribute(layout, "resource");
	}
	
	/**
	 * orient属性値を返す
	 * 
	 * @return orient属性値
	 */
	public String getOrient()
	{
		return NodeUtil.getAttribute(layout, "orient");
	}
	
	/**
	 * ノードが box 要素かどうかを返す。
	 * 
	 * @return 結果を示すブール値
	 */
	public boolean isBox()
	{
		return "box".equals(layout.getNodeName());
	}

	/**
	 * ノードが component 要素かどうかを返す。
	 * 
	 * @return 結果を示すブール値
	 */
	public boolean isComponent()
	{
		return "component".equals(layout.getNodeName());
	}
	
	/**
	 * 下位要素の配列を取得する。
	 * component 要素の場合は空の配列が返却される。
	 * 
	 * @return 下位要素の配列。
	 */
	public LayoutElement[] getElements()
	{
		ArrayList elements = new ArrayList();
		
		if ((layout != null) && !isComponent())
		{
			List nodeList = NodeUtil.getNamedChildElementList(layout, new String[]{"box", "component"});
			for (int i=0; i < nodeList.size(); i++)
			{
				LayoutElement element = new LayoutElement();
				element.loadLayout((Node)nodeList.get(i));
				elements.add(element);
			}
		}
		
		return (LayoutElement[])elements.toArray(new LayoutElement[]{});
	}
	
	/**
	 * 指定したname属性値を持つレイアウト要素が存在するかどうかを返却する。
	 * 
	 * @param name name属性値
	 * @return 結果を示すブール値
	 */
	public boolean contains(String name)
	{
		boolean result = false;
		LayoutElement[] elements = getElements();
		for (int i=0; i < elements.length; i++)
		{
			if (name.equals(elements[i].getName()))
			{
				result = true;
				break;
			}
			if (elements[i].contains(name))
			{
				result = true;
				break;
			}
		}
		return result;
	}	
}
