/******************************************************************************* * 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.HashMap; import java.util.List; import java.util.Map; import org.jboss.tools.jsf.vpe.richfaces.ComponentUtil; 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.template.VpeToggableTemplate; 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; public class RichFacesSimpleTogglePanelTemplate extends VpeAbstractTemplate implements VpeToggableTemplate { private static final String CSS_STYLE_PATH = "simpleTogglePanel/simpleTogglePanel.css"; //$NON-NLS-1$ private static final String COMPONENT_NAME = "richFacesSimpleTogglePanel"; //$NON-NLS-1$ private static final String ATTR_LABEL = "label"; //$NON-NLS-1$ private static final String ATTR_BODY_CLASS = "bodyClass"; //$NON-NLS-1$ private static final String ATTR_OPENED = "opened"; //$NON-NLS-1$ private static final String OPEN_MARKER_FACET_NAME = "openMarker"; //$NON-NLS-1$ private static final String CLOSE_MARKER_FACET_NAME = "closeMarker"; //$NON-NLS-1$ private static final String CSS_DR_STGLPANEL = "dr-stglpnl"; //$NON-NLS-1$ private static final String CSS_DR_STGLPANEL_HEADER = "dr-stglpnl-h"; //$NON-NLS-1$ private static final String CSS_DR_STGLPANEL_BODY = "dr-stglpnl-b"; //$NON-NLS-1$ private static final String CSS_RICH_STGLPANEL = "rich-stglpanel"; //$NON-NLS-1$ private static final String CSS_RICH_STGLPANEL_HEADER = "rich-stglpanel-header"; //$NON-NLS-1$ private static final String CSS_RICH_STGLPNL_MARKER = "rich-stglpnl-marker"; //$NON-NLS-1$ private static final String CSS_RICH_STGLPANEL_BODY = "rich-stglpanel-body"; //$NON-NLS-1$ private static final String COLLAPSED_STYLE = "; display: none;"; //$NON-NLS-1$ private static final String SWITCH_DIV_STYLE = "position : absolute; top: 0px; right: 5px;"; //$NON-NLS-1$ private static Map toggleMap = new HashMap(); private nsIDOMElement storedHeaderDiv = null; public VpeCreationData create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument) { Element sourceElement = (Element) sourceNode; nsIDOMElement div = visualDocument.createElement(HTML.TAG_DIV); VpeCreationData creationData = new VpeCreationData(div); ComponentUtil.setCSSLink(pageContext, CSS_STYLE_PATH, COMPONENT_NAME); div.setAttribute(HTML.ATTR_CLASS, CSS_DR_STGLPANEL + Constants.WHITE_SPACE + CSS_RICH_STGLPANEL + Constants.WHITE_SPACE + ComponentUtil.getAttribute(sourceElement, RichFaces.ATTR_STYLE_CLASS)); div.setAttribute(HTML.ATTR_STYLE, "width: " //$NON-NLS-1$ + ComponentUtil.getAttribute(sourceElement, HTML.ATTR_WIDTH) + Constants.SEMICOLON + ComponentUtil.getAttribute(sourceElement, HTML.ATTR_STYLE)); // Encode Header nsIDOMElement headerDiv = visualDocument.createElement(HTML.TAG_DIV); div.appendChild(headerDiv); headerDiv.setAttribute(HTML.ATTR_CLASS, CSS_DR_STGLPANEL_HEADER + Constants.WHITE_SPACE + CSS_RICH_STGLPANEL_HEADER + Constants.WHITE_SPACE + ComponentUtil.getAttribute(sourceElement, RichFaces.ATTR_HEADER_CLASS)); headerDiv.setAttribute(HTML.ATTR_STYLE, "position : relative; " //$NON-NLS-1$ + ComponentUtil.getHeaderBackgoundImgStyle()); /* * http://jira.jboss.com/jira/browse/JBIDE-791 * https://jira.jboss.org/jira/browse/JBIDE-3373 * * Encode the Header Facet * Find elements from the f:facet */ Map<String, List<Node>> headerFacetChildren = null; Element headerFacet = SourceDomUtil.getFacetByName(pageContext, sourceElement, RichFaces.NAME_FACET_HEADER); if (headerFacet != null) { headerFacetChildren = VisualDomUtil.findFacetElements(headerFacet, pageContext); /* * By adding attribute VPE-FACET to this visual node * we force JsfFacet to be rendered inside it * without creating an additional and superfluous visual tag. */ headerDiv.setAttribute(VpeVisualDomBuilder.VPE_FACET, RichFaces.NAME_FACET_HEADER); /* * Add header facet to the ChildrenInfo */ VpeChildrenInfo headerInfo = new VpeChildrenInfo(headerDiv); headerInfo.addSourceChild(headerFacet); creationData.addChildrenInfo(headerInfo); } else { /* * Otherwise show label attribute value as panel header */ headerDiv.appendChild(visualDocument.createTextNode(ComponentUtil .getAttribute(sourceElement, ATTR_LABEL))); } nsIDOMElement switchDiv = visualDocument.createElement(HTML.TAG_DIV); headerDiv.appendChild(switchDiv); switchDiv.setAttribute(HTML.ATTR_STYLE, SWITCH_DIV_STYLE); String markerName = OPEN_MARKER_FACET_NAME; char defaultMarkerCode = 187; boolean opened = getActiveState(sourceElement); headerDiv.setAttribute(VpeVisualDomBuilder.VPE_USER_TOGGLE_ID, (opened ? Constants.FALSE : Constants.TRUE)); storedHeaderDiv = headerDiv; if (opened) { markerName = CLOSE_MARKER_FACET_NAME; defaultMarkerCode = 171; } Element markerFacet = ComponentUtil.getFacet(sourceElement, markerName); if (markerFacet == null) { switchDiv.appendChild(visualDocument.createTextNode(Constants.EMPTY + defaultMarkerCode)); } else { VpeChildrenInfo switchInfo = new VpeChildrenInfo(switchDiv); switchInfo.addSourceChild(markerFacet); creationData.addChildrenInfo(switchInfo); } // Encode Body // if(opened) { nsIDOMElement bodyDiv = visualDocument.createElement(HTML.TAG_DIV); div.appendChild(bodyDiv); bodyDiv.setAttribute(HTML.ATTR_STYLE, "overflow: hidden; height: " //$NON-NLS-1$ + ComponentUtil.getAttribute(sourceElement, HTML.ATTR_HEIGHT) + "; width: 100%;"); //$NON-NLS-1$ nsIDOMElement table = visualDocument.createElement(HTML.TAG_TABLE); bodyDiv.appendChild(table); table.setAttribute(HTML.ATTR_CELLPADDING, Constants.ZERO_STRING); table.setAttribute(HTML.ATTR_STYLE, "width: 100%"); //$NON-NLS-1$ nsIDOMElement tr = visualDocument.createElement(HTML.TAG_TR); table.appendChild(tr); nsIDOMElement td = visualDocument.createElement(HTML.TAG_TD); tr.appendChild(td); td.setAttribute(HTML.ATTR_CLASS, CSS_DR_STGLPANEL_BODY + Constants.WHITE_SPACE + CSS_RICH_STGLPANEL_BODY + Constants.WHITE_SPACE + ComponentUtil.getAttribute(sourceElement, ATTR_BODY_CLASS)); /* * If there are some odd HTML elements from facet * add them to the panel body first. */ boolean headerHtmlElementsPresents = ((headerFacetChildren != null) && (headerFacetChildren .get(VisualDomUtil.FACET_HTML_TAGS).size() > 0)); VpeChildrenInfo bodyInfo = new VpeChildrenInfo(td); if (headerHtmlElementsPresents) { for (Node node : headerFacetChildren.get(VisualDomUtil.FACET_HTML_TAGS)) { bodyInfo.addSourceChild(node); } } /* * Add the rest panel's content */ List<Node> children = ComponentUtil.getChildren(sourceElement, true); for (Node child : children) { bodyInfo.addSourceChild(child); } creationData.addChildrenInfo(bodyInfo); // http://jira.jboss.com/jira/browse/JBIDE-791 if (!opened) { String newStyle = bodyDiv.getAttribute(HTML.ATTR_STYLE); newStyle += COLLAPSED_STYLE; bodyDiv.setAttribute(HTML.ATTR_STYLE, newStyle); } // ------------------------- // } 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 (storedHeaderDiv == null) return; String value = storedHeaderDiv .getAttribute(VpeVisualDomBuilder.VPE_USER_TOGGLE_ID); if (Constants.TRUE.equals(value) || Constants.FALSE.equals(value)) { ComponentUtil.applyAttributeValueOnChildren( VpeVisualDomBuilder.VPE_USER_TOGGLE_ID, value, ComponentUtil.getElementChildren(storedHeaderDiv)); ComponentUtil.applyAttributeValueOnChildren( VpeVisualDomBuilder.VPE_USER_TOGGLE_LOOKUP_PARENT, Constants.TRUE, ComponentUtil .getElementChildren(storedHeaderDiv)); } } private boolean getActiveState(Element sourceElement) { String opennedStr; opennedStr = (String) toggleMap.get(sourceElement); if (opennedStr == null) { opennedStr = ComponentUtil.getAttribute(sourceElement, ATTR_OPENED); } if (opennedStr == null || Constants.EMPTY.equals(opennedStr)) { opennedStr = Constants.TRUE; } return (!Constants.FALSE.equals(opennedStr)); } public void toggle(VpeVisualDomBuilder builder, Node sourceNode, String toggleId) { toggleMap.put(sourceNode, toggleId); } public void stopToggling(Node sourceNode) { toggleMap.remove(sourceNode); } public boolean recreateAtAttrChange(VpePageContext pageContext, Element sourceElement, nsIDOMDocument visualDocument, nsIDOMElement visualNode, Object data, String name, String value) { return true; } }