/*******************************************************************************
* 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.ajax4jsf.template;
import org.jboss.tools.jsf.vpe.jsf.VpeElementProxyData;
import org.jboss.tools.jsf.vpe.richfaces.ComponentUtil;
import org.jboss.tools.jsf.vpe.richfaces.template.RichFaces;
import org.jboss.tools.vpe.editor.context.VpePageContext;
import org.jboss.tools.vpe.editor.mapping.AttributeData;
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.mozilla.interfaces.nsIDOMDocument;
import org.mozilla.interfaces.nsIDOMElement;
import org.mozilla.interfaces.nsIDOMText;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* @author yradtsevich
*
*/
public class Ajax4JSFStatusTemplate extends VpeAbstractTemplate {
/*
*<vpe:tag name="a4j:status" case-sensitive="yes">
* <vpe:template children="yes" modify="yes">
* <span class="{@styleClass};{@stopStyleClass}" style="{@style};{@stopStyle}" title="{tagstring()}">
* <vpe:value expr=" {jsfvalue(@stopText)}"/>
* </span>
* </vpe:template>
*</vpe:tag>
*/
public VpeCreationData create(VpePageContext pageContext, Node sourceNode,
nsIDOMDocument visualDocument) {
Creator creator = new Creator(pageContext, (Element)sourceNode, visualDocument);
return creator.create();
}
private static class Creator {
private static final String ATTR_STOP_TEXT = "stopText";//$NON-NLS-1$
private static final String STOP_FACET_NAME = "stop";//$NON-NLS-1$
private static final String START_FACET_NAME = "start";//$NON-NLS-1$
private static final String ATTR_STOP_STYLE_CLASS = "stopStyleClass"; //$NON-NLS-1$
private static final String ATTR_STOP_STYLE = "stopStyle"; //$NON-NLS-1$
private final VpePageContext pageContext;
private final Element sourceElement;
private final nsIDOMDocument visualDocument;
private VpeCreationData vpeCreationData;
public Creator(VpePageContext pageContext, Element sourceElement,
nsIDOMDocument visualDocument) {
this.pageContext = pageContext;
this.sourceElement = sourceElement;
this.visualDocument = visualDocument;
}
public VpeCreationData create() {
nsIDOMElement mainElement = createMainElement();
vpeCreationData = new VpeCreationData(mainElement);
final VpeChildrenInfo childrenInfo = new VpeChildrenInfo(mainElement);
vpeCreationData.addChildrenInfo(childrenInfo);
Element stopFacet = ComponentUtil.getFacet(sourceElement, STOP_FACET_NAME);
if (stopFacet != null) {
childrenInfo.addSourceChild(stopFacet);
} else {
nsIDOMElement stopTextElement = createStopTextElement();
if (stopTextElement != null) {
mainElement.appendChild(createStopTextElement());
}
}
return vpeCreationData;
}
private nsIDOMElement createMainElement() {
nsIDOMElement span = visualDocument.createElement(HTML.TAG_SPAN);
// set class of the span to "{@styleClass} {@stopStyleClass}"
{
StringBuilder spanClass = new StringBuilder();
if (sourceElement.hasAttribute(RichFaces.ATTR_STYLE_CLASS)) {
String styleClass = sourceElement.getAttribute(RichFaces.ATTR_STYLE_CLASS);
spanClass.append(styleClass);
}
if (sourceElement.hasAttribute(ATTR_STOP_STYLE_CLASS)) {
String stopStyleClass = sourceElement.getAttribute(ATTR_STOP_STYLE_CLASS);
spanClass.append(HTML.VALUE_CLASS_DELIMITER).append(stopStyleClass);
}
span.setAttribute(HTML.ATTR_CLASS, spanClass.toString());
}
// set style of the span to "{@style};{@stopStyle}"
{
StringBuilder spanStyle = new StringBuilder();
if (sourceElement.hasAttribute(RichFaces.ATTR_STYLE)) {
String style = sourceElement.getAttribute(RichFaces.ATTR_STYLE);
spanStyle.append(style).append(HTML.VALUE_STYLE_DELIMITER);
}
if (sourceElement.hasAttribute(ATTR_STOP_STYLE)) {
String stopStyle = sourceElement.getAttribute(ATTR_STOP_STYLE);
spanStyle.append(stopStyle).append(HTML.VALUE_STYLE_DELIMITER);
}
span.setAttribute(HTML.ATTR_STYLE, spanStyle.toString());
}
return span;
}
/**
* Creates new {@code nsIDOMElement} and inserts text of {@code 'stopText'} attribute
* into this element. Also it registers created element in {@link #vpeCreationData}
*
* @return created {@code nsIDOMElement} or {@code null} if {@link #sourceElement}
* does not have {@code 'stopText'} attribute
*/
private nsIDOMElement createStopTextElement() {
nsIDOMElement visualElement = null;
Attr stopTextAttribute = sourceElement.getAttributeNode(ATTR_STOP_TEXT);
if (stopTextAttribute != null) {
visualElement = VisualDomUtil.createBorderlessContainer(visualDocument);
nsIDOMText textNode = visualDocument.createTextNode(
stopTextAttribute.getNodeValue());
visualElement.appendChild(textNode);
// add attribute for ability of editing
VpeElementProxyData elementData = new VpeElementProxyData();
elementData.addNodeData(new AttributeData(stopTextAttribute, textNode, true));
vpeCreationData.setElementData(elementData);
}
return visualElement;
}
/**
* Creates new object of {@link VpeChildrenInfo}, initializes it,
* and adds it to {@link #vpeCreationData}
*
* @param visualParent visual parent for {@code VpeChildrenInfo}
*/
private void addChildrenInfo(nsIDOMElement visualParent) {
final VpeChildrenInfo childrenInfo = new VpeChildrenInfo(visualParent);
vpeCreationData.addChildrenInfo(childrenInfo);
NodeList children = sourceElement.getChildNodes();
int childrenLength = children.getLength();
for (int i = 0; i < childrenLength; i++) {
Node child = children.item(i);
if (child.getNodeType() == Node.ELEMENT_NODE
&& child.getNodeName().endsWith(RichFaces.TAG_FACET)) {
Element facet = (Element)child;
String facetName = facet.getAttribute(RichFaces.ATTR_NAME);
if (START_FACET_NAME.equalsIgnoreCase(facetName)) {
// just skip
} else if (STOP_FACET_NAME.equalsIgnoreCase(facetName)) {
childrenInfo.addSourceChild(facet);
}
}
}
}
}
}