/*******************************************************************************
* Copyright (c) 2007-2008 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
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.vpe.jsf.template;
import java.util.List;
import org.jboss.tools.jst.web.tld.TaglibData;
import org.jboss.tools.vpe.editor.context.VpePageContext;
import org.jboss.tools.vpe.editor.template.VpeAbstractTemplate;
import org.jboss.tools.vpe.editor.template.VpeChildrenInfo;
import org.jboss.tools.vpe.editor.template.VpeCreationData;
import org.jboss.tools.vpe.editor.util.HTML;
import org.jboss.tools.vpe.editor.util.VisualDomUtil;
import org.jboss.tools.vpe.editor.util.XmlUtil;
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;
import org.w3c.dom.NodeList;
/**
* @author sdzmitrovich
*
*/
public class JsfFacet extends VpeAbstractTemplate {
/*
* (non-Javadoc)
*
* @see
* org.jboss.tools.vpe.editor.template.VpeTemplate#create(org.jboss.tools
* .vpe.editor.context.VpePageContext, org.w3c.dom.Node,
* org.mozilla.interfaces.nsIDOMDocument)
*/
public VpeCreationData create(VpePageContext pageContext, Node sourceNode,
nsIDOMDocument visualDocument) {
Element sourceElement = (Element) sourceNode;
Node facetParent = null;
nsIDOMElement facetVisualTag = null;
NodeList children = sourceNode.getChildNodes();
boolean jsfComponentFound = false;
/*
* https://jira.jboss.org/jira/browse/JBIDE-3373
* By rendering facet to existed visual node
* we avoid unwarranted tag creation for facet element.
*/
facetParent = sourceNode.getParentNode();
nsIDOMNode facetParentVisualTag = pageContext.getDomMapping().getVisualNode(facetParent);
facetVisualTag = VisualDomUtil.findVisualTagWithFacetAttribute(
facetParentVisualTag, sourceElement.getAttribute(JSF.ATTR_NAME));
/*
* When no tag found use 'SPAN' tag by default.
* So facet will be rendered in any case.
*/
if (null == facetVisualTag) {
facetVisualTag = visualDocument.createElement(HTML.TAG_SPAN);
}
VpeCreationData creationData = new VpeCreationData(facetVisualTag);
/*
* Only one JSF component may be present inside a facet tag, if more are
* present only the first one is rendered and the other ones are
* ignored.
*/
for (int i = children.getLength() - 1; i >= 0 ; i--) {
Node child = children.item(i);
String sourcePrefix = child.getPrefix();
List<TaglibData> taglibs = XmlUtil.getTaglibsForNode(sourceNode,
pageContext);
TaglibData sourceNodeTaglib = XmlUtil.getTaglibForPrefix(
sourcePrefix, taglibs);
if (null != sourceNodeTaglib) {
String sourceNodeUri = sourceNodeTaglib.getUri();
if (VisualDomUtil.JSF_CORE_URI.equalsIgnoreCase(sourceNodeUri)
|| VisualDomUtil.JSF_HTML_URI.equalsIgnoreCase(sourceNodeUri)
|| VisualDomUtil.RICH_FACES_URI.equalsIgnoreCase(sourceNodeUri)
|| VisualDomUtil.A4J_URI.equalsIgnoreCase(sourceNodeUri)
|| VisualDomUtil.FACELETS_URI.equalsIgnoreCase(sourceNodeUri)) {
VpeChildrenInfo childrenInfo = new VpeChildrenInfo(facetVisualTag);
childrenInfo.addSourceChild(child);
creationData.addChildrenInfo(childrenInfo);
jsfComponentFound = true;
break;
}
}
}
if (!jsfComponentFound) {
facetVisualTag.setAttribute(HTML.ATTR_STYLE, "display: none; "); //$NON-NLS-1$
creationData.addChildrenInfo(new VpeChildrenInfo(facetVisualTag));
}
return creationData;
}
}