view src/treecms/proto/edit/EditableTreeBuilder.java @ 20:e950264f82d3

commit
author ShoshiTAMAKI
date Sun, 17 Oct 2010 00:29:56 +0900
parents src/treecms/proto/edit/EditableNodeAPITreeBuilder.java@6b8f33b7e09f
children cce963b8a4fd
line wrap: on
line source

package treecms.proto.edit;

import java.util.LinkedList;
import java.util.List;

import treecms.proto.api.Node;
import treecms.proto.api.TreeBuilder;

public class EditableTreeBuilder implements TreeBuilder
{
	private TreeBuilder m_builder;
	private Node m_newRoot;
	private Node m_oldRoot;
	
	public EditableTreeBuilder(Node _target,TreeBuilder _builder)
	{
		m_builder = _builder;
		
		//search path
		m_oldRoot = _builder.getContents();
		List<Node> path = findPath(m_oldRoot,_target);
		
		//clone tree
		List<Node> clonedTree = cloneTree(path);
		m_newRoot = clonedTree.get(0);
	}
	
	private List<Node> cloneTree(List<Node> _path)
	{
		List<Node> clonedTree = new LinkedList<Node>();
		
		Node origRoot = _path.get(0);
		Node clonedRoot = m_builder.createNode();
		clonedRoot.setTitle(origRoot.getTitle());
		clonedRoot.setClassName(origRoot.getClassName());
		
		
		return clonedTree;
	}
	
	public List<Node> findPathTest(Node _root,Node _child)
	{
		return findPath(_root,_child);
	}
	
	private List<Node> findPath(Node _root,Node _child)
	{
		LinkedList<Node> list = new LinkedList<Node>();
		findPath(_root,_child,list);
		list.addFirst(_root);
		return list;
	}
	
	private boolean findPath(Node _root,Node _child,LinkedList<Node> _list)
	{
		if(_root == _child){
			return true;
		}
		
		for(Node child : _root.getChildList()){
			if(findPath(child,_child,_list)){
				_list.addFirst(child);
				return true;
			}
		}
		return false;
	}

	@Override
	public Node getContents()
	{
		// TODO Auto-generated method stub
		return m_newRoot;
	}

	@Override
	public Node createNode()
	{
		// TODO Auto-generated method stub
		return m_builder.createNode();
	}
}