/******************************************************************************* * 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 java.util.List; import java.util.Map; import org.jboss.tools.jsf.vpe.richfaces.ComponentUtil; import org.jboss.tools.jst.web.tld.TaglibData; import org.jboss.tools.vpe.editor.VpeVisualDomBuilder; 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.SourceDomUtil; 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.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * Default template for <code>rich:panel</code> component. * <p> * It is used to render <code>rich:panel</code> for RichFaces until version 3.3. */ public class RichFacesPanelTemplate extends VpeAbstractTemplate { public VpeCreationData create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument) { ComponentUtil.setCSSLink(pageContext, "panel/panel.css", "richFacesPanel"); //$NON-NLS-1$ //$NON-NLS-2$ Element sourceElement = (Element)sourceNode; nsIDOMElement div = visualDocument.createElement("div"); //$NON-NLS-1$ VpeCreationData creationData = new VpeCreationData(div); String styleClass = "dr-pnl rich-panel"; //$NON-NLS-1$ String styleClassAttrName = "styleClass"; //$NON-NLS-1$ if (sourceElement.hasAttribute(styleClassAttrName)) { styleClass += " " + sourceElement.getAttribute(styleClassAttrName); //$NON-NLS-1$ } div.setAttribute("class", styleClass); //$NON-NLS-1$ String styleAttrName = "style"; //$NON-NLS-1$ if(sourceElement.hasAttribute(styleAttrName)) { String style = sourceElement.getAttribute(styleAttrName); div.setAttribute("style", style); //$NON-NLS-1$ } /* * Encode the Header Facet * Find elements from the f:facet */ Element headerFacet = SourceDomUtil.getFacetByName(pageContext, sourceElement, RichFaces.NAME_FACET_HEADER); Map<String, List<Node>> headerFacetChildren = null; if (headerFacet != null) { headerFacetChildren = VisualDomUtil.findFacetElements(headerFacet, pageContext); nsIDOMElement headerDiv = visualDocument.createElement(HTML.TAG_DIV); /* * By adding attribute VPE-FACET to this visual node * we force JsfFacet to be rendered inside it. */ headerDiv.setAttribute(VpeVisualDomBuilder.VPE_FACET, RichFaces.NAME_FACET_HEADER); div.appendChild(headerDiv); String headerClass = "dr-pnl-h rich-panel-header"; //$NON-NLS-1$ if (sourceElement.hasAttribute(RichFaces.ATTR_HEADER_CLASS)) { headerClass += " " + sourceElement.getAttribute(RichFaces.ATTR_HEADER_CLASS); //$NON-NLS-1$ } headerDiv.setAttribute(HTML.ATTR_CLASS, headerClass); headerDiv.setAttribute(HTML.ATTR_STYLE, ComponentUtil.getHeaderBackgoundImgStyle()); /* * https://issues.jboss.org/browse/JBIDE-6072 * Render the header: differs for RF3.3 and RF4. * RF4 template for Panel overrides this method. * Footer facet is not supposed to be in <rich:panel>, * but RF3 renders its content inside the body content. */ renderHeaderFacet(headerFacet, headerDiv, creationData, pageContext, visualDocument); } /* * Encode rich:panel content */ nsIDOMElement bodyDiv = visualDocument.createElement(HTML.TAG_DIV); div.appendChild(bodyDiv); String bodyClass = "dr-pnl-b rich-panel-body"; //$NON-NLS-1$ if (sourceElement.hasAttribute(RichFaces.ATTR_BODY_CLASS)) { bodyClass += " " + sourceElement.getAttribute(RichFaces.ATTR_BODY_CLASS); //$NON-NLS-1$ } bodyDiv.setAttribute(HTML.ATTR_CLASS, bodyClass); VpeChildrenInfo bodyInfo = null; bodyInfo = new VpeChildrenInfo(bodyDiv); /* * If there are some odd HTML elements from facet * add them to the panel body first. */ addHeaderFacetElementsToPanelBody(headerFacetChildren,bodyInfo, pageContext); addElementsFromOtherFacetsToPanelBody(sourceElement, bodyInfo, pageContext); /* * Add the rest panel's content */ List<Node> children = ComponentUtil.getChildren(sourceElement, true); for (Node child : children) { bodyInfo.addSourceChild(child); } creationData.addChildrenInfo(bodyInfo); return creationData; } /** * * * @param headerFacet * @param headerDiv * @param headerFacetChildren could be null if not required * @param creationData * @param pageContext * @param visualDocument */ protected void renderHeaderFacet(Element headerFacet, nsIDOMElement headerDiv, VpeCreationData creationData, VpePageContext pageContext, nsIDOMDocument visualDocument) { NodeList children = headerFacet.getChildNodes(); for (int i = 0; i < children.getLength() ; i++) { Node child = children.item(i); String sourcePrefix = child.getPrefix(); List<TaglibData> taglibs = XmlUtil.getTaglibsForNode(headerFacet, 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 headerInfo = new VpeChildrenInfo(headerDiv); headerInfo.addSourceChild(child); creationData.addChildrenInfo(headerInfo); break; } } } } protected void addHeaderFacetElementsToPanelBody( Map<String, List<Node>> headerFacetChildren, VpeChildrenInfo bodyInfo, VpePageContext pageContext) { if ((headerFacetChildren != null) && (headerFacetChildren .get(VisualDomUtil.FACET_HTML_TAGS).size() > 0)) { for (Node node : headerFacetChildren.get(VisualDomUtil.FACET_HTML_TAGS)) { bodyInfo.addSourceChild(node); } } } protected void addElementsFromOtherFacetsToPanelBody(Element sourceElement, VpeChildrenInfo bodyInfo, VpePageContext pageContext) { NodeList facets = sourceElement.getChildNodes(); Map<String, List<Node>> facetChildren = null; for (int i = 0; i < facets.getLength(); i++) { Node facet = facets.item(i); if (SourceDomUtil.isFacetElement(pageContext, facet) && !RichFaces.NAME_FACET_HEADER.equalsIgnoreCase( ((Element)facet).getAttribute("name"))) { //$NON-NLS-1$ /* * Get facet children by groups (html, jsf, odd) */ facetChildren = VisualDomUtil.findFacetElements(facet, pageContext); if (((facetChildren != null) && (facetChildren.get (VisualDomUtil.FACET_HTML_TAGS).size() > 0))) { for (Node node : facetChildren.get(VisualDomUtil.FACET_HTML_TAGS)) { bodyInfo.addSourceChild(node); } } } } } /* (non-Javadoc) * @see org.jboss.tools.vpe.editor.template.VpeAbstractTemplate#isRecreateAtAttrChange(org.jboss.tools.vpe.editor.context.VpePageContext, org.w3c.dom.Element, org.mozilla.interfaces.nsIDOMDocument, org.mozilla.interfaces.nsIDOMElement, java.lang.Object, java.lang.String, java.lang.String) */ @Override public boolean recreateAtAttrChange(VpePageContext pageContext, Element sourceElement, nsIDOMDocument visualDocument, nsIDOMElement visualNode, Object data, String name, String value) { return true; } }