/*******************************************************************************
* 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 java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import org.jboss.tools.jsf.vpe.richfaces.ComponentUtil;
import org.jboss.tools.jsf.vpe.richfaces.HtmlComponentUtil;
import org.jboss.tools.vpe.editor.VpeVisualDomBuilder;
import org.jboss.tools.vpe.editor.context.VpePageContext;
import org.jboss.tools.vpe.editor.mapping.VpeElementMapping;
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.template.VpeTemplateSafeWrapper;
import org.jboss.tools.vpe.editor.template.VpeToggableTemplate;
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;
import org.w3c.dom.NodeList;
public class RichFacesToggleControlTemplate extends VpeAbstractTemplate implements VpeToggableTemplate {
private static Map toggleMap = new HashMap();
private static nsIDOMElement storedSwitchSpan = null;
public VpeCreationData create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument) {
Element sourceElement = (Element)sourceNode;
nsIDOMElement span = visualDocument.createElement("span"); //$NON-NLS-1$
storedSwitchSpan = span;
VpeCreationData creationData = new VpeCreationData(span);
ComponentUtil.correctAttribute(sourceElement, span,
"styleClass", //$NON-NLS-1$
HtmlComponentUtil.HTML_CLASS_ATTR, "", ""); //$NON-NLS-1$ //$NON-NLS-2$
ComponentUtil.correctAttribute(sourceElement, span,
"style", //$NON-NLS-1$
HtmlComponentUtil.HTML_STYLE_ATTR, "color:blue;text-decoration:underline;", "color:blue;text-decoration:underline;"); //$NON-NLS-1$ //$NON-NLS-2$
String switchToStateAttrName = "switchToState"; //$NON-NLS-1$
String switchToState = sourceElement.hasAttribute(switchToStateAttrName) ?
sourceElement.getAttribute(switchToStateAttrName).trim() : Constants.EMPTY;
span.setAttribute("vpe-user-toggle-id", switchToState); //$NON-NLS-1$
List<Node> children = ComponentUtil.getChildren(sourceElement);
VpeChildrenInfo bodyInfo = new VpeChildrenInfo(span);
String valueAttrName = "value"; //$NON-NLS-1$
String value = sourceElement.hasAttribute(valueAttrName) ? sourceElement.getAttribute(valueAttrName) : Constants.EMPTY;
nsIDOMNode valueText = visualDocument.createTextNode(value);
span.appendChild(valueText);
for (Node child : children) {
bodyInfo.addSourceChild(child);
}
creationData.addChildrenInfo(bodyInfo);
return creationData;
}
/**
* Is invoked after construction of all child nodes of the current visual node.
* @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.
* @param data Object <code>VpeCreationData</code>, built by a method <code>create</code>
*/
public void validate(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument, VpeCreationData data) {
super.validate(pageContext, sourceNode, visualDocument, data);
if (storedSwitchSpan == null) return;
String vpeToogleAttrName = "vpe-user-toggle-id"; //$NON-NLS-1$
if (storedSwitchSpan.hasAttribute(vpeToogleAttrName)) {
String value = storedSwitchSpan.getAttribute(vpeToogleAttrName);
applyAttributeValueOnChildren("vpe-user-toggle-id", value, ComponentUtil.getChildren(storedSwitchSpan)); //$NON-NLS-1$
}
applyAttributeValueOnChildren("vpe-user-toggle-lookup-parent", "true", ComponentUtil.getChildren(storedSwitchSpan)); //$NON-NLS-1$ //$NON-NLS-2$
}
private void applyAttributeValueOnChildren(String attrName, String attrValue, List<nsIDOMNode> children) {
if (children == null || attrName == null || attrValue == null) return;
for (nsIDOMNode child : children) {
if (child instanceof nsIDOMElement) {
nsIDOMElement childElement = queryInterface(child, nsIDOMElement.class);
childElement.setAttribute(attrName, attrValue);
applyAttributeValueOnChildren(attrName, attrValue, ComponentUtil.getChildren(childElement));
}
}
}
public void toggle(VpeVisualDomBuilder builder, Node sourceNode, String toggleId) {
/*
* Actually, toggling mechanism should be updated for this template.
* Because it's very old and not functioning now.
*/
toggleMap.put(sourceNode, toggleId);
Element sourceElement = (Element)(sourceNode instanceof Element ? sourceNode : sourceNode.getParentNode());
if (!sourceElement.hasAttribute(HTML.ATTR_FOR)) {
return;
}
String forIds = sourceElement.getAttribute(HTML.ATTR_FOR);
StringTokenizer st = new StringTokenizer(forIds.trim(), ",", false); //$NON-NLS-1$
while (st.hasMoreElements()) {
String id = st.nextToken().trim();
if (null == id) {
continue;
}
id = id.trim();
List<Element> sourceElements = RichFaces.findElementsById(
(Element) sourceElement.getOwnerDocument()
.getDocumentElement(), id, ":togglePanel"); //$NON-NLS-1$
for (Element el : sourceElements) {
if (builder != null) {
VpeElementMapping elementMapping = (VpeElementMapping)builder.getDomMapping().getNodeMapping(el);
if (elementMapping != null) {
RichFacesTogglePanelTemplate tpTemplate = (RichFacesTogglePanelTemplate) ((VpeTemplateSafeWrapper)
elementMapping.getTemplate()).getAdapter(RichFacesTogglePanelTemplate.class);
if (tpTemplate != null) {
tpTemplate.toggle(el, toggleId);
builder.updateNode(el);
}
}
}
}
}
}
public void stopToggling(Node sourceNode) {
toggleMap.remove(sourceNode);
}
}