/******************************************************************************* * 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.richfaces.template; import java.util.List; import java.util.Map; import org.jboss.tools.jsf.vpe.richfaces.ComponentUtil; 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.Constants; 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.mozilla.interfaces.nsIDOMDocument; import org.mozilla.interfaces.nsIDOMElement; import org.w3c.dom.Element; import org.w3c.dom.Node; /** * Template for <rich:progressBar/> tag. * * @author dmaliarevich */ public class RichFacesProgressBarTemplate extends VpeAbstractTemplate /*AbstractRichFacesTemplate*/ { private static final String CSS_EXTENSION = "progressBar"; //$NON-NLS-1$ private static final String CSS_PATH = "progressBar/progressBar.css"; //$NON-NLS-1$ private static final String NBSP = "\u00A0"; //$NON-NLS-1$ private static final String DEFAULT_HEIGHT = "height: 13px;"; //$NON-NLS-1$ private static final String DEFAULT_UPLOADED_STATUS = "60%"; //$NON-NLS-1$ private static final String CSS_PB_BLOCK = "rich-progress-bar-block"; //$NON-NLS-1$ private static final String CSS_PB_SHELL = "rich-progress-bar-shell"; //$NON-NLS-1$ private static final String CSS_PB_UPLOADED = "rich-progress-bar-uploaded"; //$NON-NLS-1$ private static final String CSS_PB_HEIGHT = "rich-progress-bar-height"; //$NON-NLS-1$ private static final String CSS_PB_WIDTH = "rich-progress-bar-width"; //$NON-NLS-1$ private static final String CSS_PB_SHELL_DIG = "rich-progress-bar-shell-dig"; //$NON-NLS-1$ private static final String CSS_PB_UPLOADED_DIG = "rich-progress-bar-uploaded-dig"; //$NON-NLS-1$ private static final String CSS_PB_REMAINED = "rich-progress-bar-remained"; //$NON-NLS-1$ private static final String CSS_PB_PADDING = "rich-progress-bar-padding"; //$NON-NLS-1$ private static final String CSS_PB_COMPLETED = "rich-progress-bar-completed"; //$NON-NLS-1$ private static final String CSS_PB_HEIGHT_DIG = "rich-progress-bar-height-dig"; //$NON-NLS-1$ private static final String CSS_PB_VPE_TEXT = "rich-progress-bar-vpe-text"; //$NON-NLS-1$ public VpeCreationData create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument) { /* * Add CSS link to the current page */ ComponentUtil.setCSSLink(pageContext, CSS_PATH, CSS_EXTENSION); Element sourceElement = (Element) sourceNode; /* * Get source element attributes */ String style = ComponentUtil.getAttribute(sourceElement, HTML.ATTR_STYLE); String styleClass = ComponentUtil.getAttribute(sourceElement, RichFaces.ATTR_STYLE_CLASS); String sourceLabel = ComponentUtil.getAttribute(sourceElement, RichFaces.ATTR_LABEL); if (ComponentUtil.isBlank(styleClass)) { styleClass = Constants.EMPTY; } if (ComponentUtil.isBlank(style)) { style = DEFAULT_HEIGHT; } /* * Create tags */ nsIDOMElement progressDiv = visualDocument.createElement(HTML.TAG_DIV); nsIDOMElement remainDiv = visualDocument.createElement(HTML.TAG_DIV); nsIDOMElement uploadDiv = visualDocument.createElement(HTML.TAG_DIV); nsIDOMElement completeDiv = visualDocument.createElement(HTML.TAG_DIV); nsIDOMElement vpeTextDiv = visualDocument.createElement(HTML.TAG_DIV); /* * if there are any suitable facets or lable value * or supplementary HTML tags from facets * then progress bar has more divs than usual. */ Element initialFacet = SourceDomUtil.getFacetByName(pageContext, sourceElement, "initial"); //$NON-NLS-1$ Map<String, List<Node>> initialFacetChildren = VisualDomUtil.findFacetElements(initialFacet, pageContext); boolean initialFacetHtmlChildrenPresent = initialFacetChildren .get(VisualDomUtil.FACET_HTML_TAGS).size() > 0; Element completeFacet = SourceDomUtil.getFacetByName(pageContext, sourceElement, "complete"); //$NON-NLS-1$ Map<String, List<Node>> completeFacetChildren = VisualDomUtil.findFacetElements(completeFacet, pageContext); boolean completeFacetHtmlChildrenPresent = completeFacetChildren .get(VisualDomUtil.FACET_HTML_TAGS).size() > 0; List<Node> children = ComponentUtil.getChildren(sourceElement, true); boolean progressBarWithLabel = initialFacetHtmlChildrenPresent || completeFacetHtmlChildrenPresent || (children.size() > 0) || ComponentUtil.isNotBlank(sourceLabel); /* * Create VpeCreationData */ VpeCreationData creationData = new VpeCreationData(progressDiv); // VpeChildrenInfo vpeTextInfo = new VpeChildrenInfo(progressDiv); // for (Node child : children) { // System.out.println("--add child=[" + child.getNodeName() + ", " // + child.getNodeValue() + "]"); // vpeTextInfo.addSourceChild(child); // } // creationData.addChildrenInfo(vpeTextInfo); /* * Filling in the divs */ if (progressBarWithLabel) { progressDiv.setAttribute(HTML.ATTR_CLASS, CSS_PB_BLOCK + Constants.WHITE_SPACE + CSS_PB_WIDTH + Constants.WHITE_SPACE + CSS_PB_SHELL_DIG + Constants.WHITE_SPACE + styleClass); remainDiv.setAttribute(HTML.ATTR_CLASS, CSS_PB_WIDTH + Constants.WHITE_SPACE + CSS_PB_REMAINED + Constants.WHITE_SPACE + CSS_PB_PADDING); uploadDiv.setAttribute(HTML.ATTR_CLASS, CSS_PB_UPLOADED_DIG); vpeTextDiv.setAttribute(HTML.ATTR_CLASS, CSS_PB_HEIGHT_DIG + Constants.WHITE_SPACE + CSS_PB_UPLOADED_DIG + Constants.WHITE_SPACE + CSS_PB_VPE_TEXT); completeDiv.setAttribute(HTML.ATTR_CLASS, CSS_PB_HEIGHT_DIG + Constants.WHITE_SPACE + CSS_PB_WIDTH + Constants.WHITE_SPACE + CSS_PB_COMPLETED + Constants.WHITE_SPACE + CSS_PB_PADDING); /* * Adding facets HTML elements */ VpeChildrenInfo vpeTextInfo = new VpeChildrenInfo(vpeTextDiv); if (initialFacetHtmlChildrenPresent) { for (Node node : initialFacetChildren.get(VisualDomUtil.FACET_HTML_TAGS)) { vpeTextInfo.addSourceChild(node); } } if (completeFacetHtmlChildrenPresent) { for (Node node : completeFacetChildren.get(VisualDomUtil.FACET_HTML_TAGS)) { vpeTextInfo.addSourceChild(node); } } /* * Add the rest bar's content */ for (Node child : children) { vpeTextInfo.addSourceChild(child); } /* * Adding ChildrenInfo to CreationData */ creationData.addChildrenInfo(vpeTextInfo); /* * Adding label to the bar's content */ if (ComponentUtil.isNotBlank(sourceLabel)) { vpeTextDiv.appendChild(visualDocument.createTextNode(sourceLabel)); } /* * Creating tags structure */ progressDiv.appendChild(remainDiv); progressDiv.appendChild(uploadDiv); progressDiv.appendChild(vpeTextDiv); uploadDiv.appendChild(completeDiv); /* * Add nbsp; for correct div height */ remainDiv.appendChild(visualDocument.createTextNode(NBSP)); completeDiv.appendChild(visualDocument.createTextNode(NBSP)); } else { progressDiv.setAttribute(HTML.ATTR_CLASS, CSS_PB_BLOCK + Constants.WHITE_SPACE + CSS_PB_WIDTH + Constants.WHITE_SPACE + CSS_PB_SHELL + Constants.WHITE_SPACE + styleClass); uploadDiv.setAttribute(HTML.ATTR_CLASS, CSS_PB_HEIGHT + Constants.WHITE_SPACE + CSS_PB_UPLOADED); /* * Creating tags structure */ progressDiv.appendChild(uploadDiv); } /* * Adding common styles */ remainDiv.setAttribute(HTML.ATTR_STYLE, style); uploadDiv.setAttribute(HTML.ATTR_STYLE, "width: " //$NON-NLS-1$ + DEFAULT_UPLOADED_STATUS + "; " + style); //$NON-NLS-1$ completeDiv.setAttribute(HTML.ATTR_STYLE, style); vpeTextDiv.setAttribute(HTML.ATTR_STYLE, style); return creationData; } @Override public boolean recreateAtAttrChange(VpePageContext pageContext, Element sourceElement, nsIDOMDocument visualDocument, nsIDOMElement visualNode, Object data, String name, String value) { return true; } }