/*******************************************************************************
 * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is made available under the terms of the
 * Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Exadel, Inc. and Red Hat, Inc. - initial API and implementation
 ******************************************************************************/
package org.jboss.tools.jsf.vpe.richfaces.template;

import static org.jboss.tools.vpe.xulrunner.util.XPCOM.queryInterface;

import org.jboss.tools.jsf.vpe.richfaces.ComponentUtil;
import org.jboss.tools.vpe.editor.context.VpePageContext;
import org.jboss.tools.vpe.editor.template.VpeCreationData;
import org.jboss.tools.vpe.editor.util.Constants;
import org.jboss.tools.vpe.editor.util.HTML;
import org.mozilla.interfaces.nsIDOMDocument;
import org.mozilla.interfaces.nsIDOMElement;
import org.mozilla.interfaces.nsIDOMNode;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

/**
 * Create template for rich:treeNodes element
 * 
 * @author dsakovich@exadel.com
 * 
 */
public class RichFacesTreeNodeTemplate extends RichFacesAbstractTreeTemplate {

    /**
     * Creates a node of the visual tree on the node of the source tree. This
     * visual node should not have the parent node This visual node can have
     * child nodes.
     * 
     * @param pageContext
     *                Contains the information on edited page.
     * @param sourceNode
     *                The current node of the source tree.
     * @param visualDocument
     *                The document of the visual tree.
     * @return The information on the created node of the visual tree.
     */
    public VpeCreationData create(VpePageContext pageContext, Node sourceNode,
	    nsIDOMDocument visualDocument) {

	nsIDOMElement div = visualDocument.createElement(HTML.TAG_DIV);
	nsIDOMElement visualElement = visualDocument
		.createElement(HTML.TAG_TABLE);
	addBasicTreeNodeAttributes(visualElement);
	div.appendChild(visualElement);
	nsIDOMElement tbody = visualDocument.createElement(HTML.TAG_TBODY);

	nsIDOMElement tableRow = visualDocument.createElement(HTML.TAG_TR);
	addAttributeToTableNode((Element) sourceNode, tableRow);
	visualElement.appendChild(tbody);
	tbody.appendChild(tableRow);

	VpeCreationData vpeCreationData = new VpeCreationData(div);
	createBasicTree(pageContext, visualDocument, tableRow, sourceNode,
		vpeCreationData);
	return vpeCreationData;
    }

    @Override
    public void setAttribute(VpePageContext pageContext, Element sourceElement,
	    nsIDOMDocument visualDocument, nsIDOMNode visualNode, Object data,
	    String name, String value) {
	/*
	 * processed only next attributes iconExpanded and icon, because tree
	 * always shows as expanded and information is it leaf or not contains
	 * in model
	 */
	if (NODE_ICON_EXPANDED_ATTR_NAME.equalsIgnoreCase(name)) {
	    nsIDOMElement expandedIconCell = queryInterface(
	    		visualNode.getChildNodes().item(0), nsIDOMElement.class);
	    nsIDOMElement img = queryInterface(expandedIconCell.getChildNodes().item(0),
			    nsIDOMElement.class);
	    ComponentUtil.setImgFromResources(pageContext, img, value,
		    UNDEFINED_ICON);
	    img.setAttribute(ICON_PARAM_NAME, Constants.EMPTY);
	} else if (NODE_ICON_ATTR_NAME.equals(name)
		&& !isLastElement(visualNode)) {
	    nsIDOMElement iconCell = queryInterface(visualNode.getChildNodes().item(1),
	    		nsIDOMElement.class);
	    nsIDOMElement img = queryInterface(iconCell.getChildNodes().item(0),
	    		nsIDOMElement.class);
	    ComponentUtil.setImgFromResources(pageContext, img, value,
		    UNDEFINED_ICON);
	    img.setAttribute(ICON_PARAM_NAME, Constants.EMPTY);
	} else if (NODE_ICON_LEAF_ATTR_NAME.equals(name)
		&& isLastElement(sourceElement)) {
	    nsIDOMElement iconCell = queryInterface(visualNode.getChildNodes().item(1),
	    		nsIDOMElement.class);
	    nsIDOMElement img = queryInterface(iconCell.getChildNodes().item(0),
	    		nsIDOMElement.class);
	    ComponentUtil.setImgFromResources(pageContext, img, value,
		    UNDEFINED_ICON);
	    img.setAttribute(ICON_PARAM_NAME, Constants.EMPTY);
	}
    }

    @Override
    public void removeAttribute(VpePageContext pageContext,
	    Element sourceElement, nsIDOMDocument visualDocument,
	    nsIDOMNode visualNode, Object data, String name) {
	/*
	 * processed only next attributes iconExpanded and icon, because tree
	 * always shows as expanded and information is it leaf or not contains
	 * in model
	 */

    Element parentElement = (Element) sourceElement.getParentNode();
	boolean showLinesValue = getShowLinesAttr(sourceElement);
	if (NODE_ICON_EXPANDED_ATTR_NAME.equalsIgnoreCase(name)) {
	    
		nsIDOMElement expandedIconCell = queryInterface(visualNode
	    		.getChildNodes().item(0), nsIDOMElement.class);
	    nsIDOMElement img = queryInterface(expandedIconCell.getChildNodes().item(0),
			    nsIDOMElement.class);	    
	    
	    if (parentElement.hasAttribute(NODE_ICON_EXPANDED_ATTR_NAME)) {
	    	String parentAttrName = parentElement.getAttribute(NODE_ICON_EXPANDED_ATTR_NAME);
	    	ComponentUtil.setImgFromResources(pageContext, img,
					parentAttrName, UNDEFINED_ICON);
	    } else {
	    	ComponentUtil.setImg(img,
					showLinesValue == true ? ICON_EXPANDED_WITH_LINES
						: ICON_EXPANDED_WITHOUT_LINES);
	    }
	    img.setAttribute(ICON_PARAM_NAME, DEFAULT_ICON_EXPANDED_PARAM_VALUE);
	} else if (NODE_ICON_ATTR_NAME.equalsIgnoreCase(name)
		&& !isLastElement(sourceElement)) {
	    
		nsIDOMElement iconCell = queryInterface(visualNode.getChildNodes().item(1),
	    		nsIDOMElement.class);
	    nsIDOMElement img = queryInterface(iconCell.getChildNodes().item(0),
	    		nsIDOMElement.class);
	    
	    if (parentElement.hasAttribute(NODE_ICON_ATTR_NAME)) {
	    	String parentAttrName = parentElement.getAttribute(NODE_ICON_ATTR_NAME);
	    	ComponentUtil.setImgFromResources(pageContext, img,
					parentAttrName, UNDEFINED_ICON);
	    } else {
	    	ComponentUtil.setImg(img,
					showLinesValue == true ? ICON_NODE_WITH_LINES
						: ICON_NODE_WITHOUT_LINES);
	    }
	    img.setAttribute(ICON_PARAM_NAME, DEFAULT_ICON_PARAM_VALUE);

	} else if (NODE_ICON_LEAF_ATTR_NAME.equalsIgnoreCase(name)
		&& isLastElement(sourceElement)) {
		
	    nsIDOMElement iconCell = queryInterface(visualNode.getChildNodes().item(1),
	    		nsIDOMElement.class);
	    nsIDOMElement img = queryInterface(iconCell.getChildNodes().item(0), nsIDOMElement.class);
	    
	    if (parentElement.hasAttribute(NODE_ICON_LEAF_ATTR_NAME)) {
	    	String parentAttrName = parentElement.getAttribute(NODE_ICON_LEAF_ATTR_NAME);
	    	ComponentUtil.setImgFromResources(pageContext, img,
					parentAttrName, UNDEFINED_ICON);
	    } else {
	    	ComponentUtil.setImg(img,
					showLinesValue == true ? ICON_LEAF_WITH_LINES
						: ICON_LEAF_WITHOUT_LINES);
	    }
	    img.setAttribute(ICON_PARAM_NAME, NODE_ICON_LEAF_ATTR_NAME);
	}
    }

}
