/******************************************************************************* * Copyright (c) 2007-2011 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 org.jboss.tools.vpe.editor.context.VpePageContext; import org.jboss.tools.vpe.editor.template.VpeAbstractTemplate; 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.w3c.dom.Element; import org.w3c.dom.Node; public class RichFacesCollapsibleSubTableTemplate extends VpeAbstractTemplate { private static final String CST_TBODY_CLASS = "rf-cst"; //$NON-NLS-1$ private static final String CST_ROW_CLASS = "rf-cst-r"; //$NON-NLS-1$ private static final String CST_FIRST_RAW_CLASS = "rf-cst-fst-r"; //$NON-NLS-1$ private static final String CST_CELL_CLASS = "rf-cst-c"; //$NON-NLS-1$ private static final String CST_HEADER_CLASS = "rf-cst-hdr"; //$NON-NLS-1$ private static final String CST_FIRST_HEADER_CLASS = "rf-cst-hdr-fst"; //$NON-NLS-1$ private static final String CST_FIRST_HEADER_ROW_CLASS = "rf-cst-hdr-fst-r"; //$NON-NLS-1$ private static final String CST_HEADER_CELL_CLASS = "rf-cst-hdr-c"; //$NON-NLS-1$ private static final String CST_SUBHEADER_CLASS = "rf-cst-shdr"; //$NON-NLS-1$ private static final String CST_SUBHEADER_CELL_CLASS = "rf-cst-shdr-c"; //$NON-NLS-1$ private static final String CST_FOOTER_CLASS = "rf-cst-ftr"; //$NON-NLS-1$ private static final String CST_FIRST_FOOTER_CLASS = "rf-cst-ftr-fst"; //$NON-NLS-1$ private static final String CST_FOOTER_CELL_CLASS = "rf-cst-ftr-c"; //$NON-NLS-1$ private static final String CST_SUBFOOTER_CLASS = "rf-cst-sftr"; //$NON-NLS-1$ private static final String CST_FIRST_SUBFOOTER_CLASS = "rf-cst-sftr-fst"; //$NON-NLS-1$ private static final String CST_SUBFOOTER_CELL_CLASS = "rf-cst-sftr-c"; //$NON-NLS-1$ public VpeCreationData create(final VpePageContext pageContext, final Node sourceNode, final nsIDOMDocument visualDocument) { final Element sourceElement = (Element) sourceNode; final nsIDOMElement tbody = visualDocument.createElement(HTML.TAG_TBODY); /* * Copy attributes from the source node to visual node. */ VisualDomUtil.copyAttributes(sourceNode, tbody); /* * Add collapsible style property */ String displayStyle = "display: table-row-group;"; //$NON-NLS-1$ if (RichFaces.readCollapsedStateFromSourceNode(sourceNode)) { displayStyle = "display: none;"; //$NON-NLS-1$ } /* * Get previous style attribute value */ String style = null; if (sourceElement.hasAttribute(HTML.ATTR_STYLE)) { style = sourceElement.getAttribute(HTML.ATTR_STYLE); } style += displayStyle; /* * Re-set style to the visual node */ tbody.setAttribute(HTML.ATTR_STYLE, style); tbody.setAttribute(HTML.ATTR_CLASS, CST_TBODY_CLASS); /* * Create VpeCreationData for this visual node. * Initialize ChildrenEncoder. */ VpeCreationData creationData = new VpeCreationData(tbody); RichFacesDataTableChildrenEncoder childrenEncoder = new RichFacesDataTableChildrenEncoder( creationData, visualDocument, sourceElement, tbody); childrenEncoder.setRowClasses(CST_FIRST_RAW_CLASS, CST_ROW_CLASS); /* * Encode header */ childrenEncoder.encodeTableHeader( pageContext, tbody, null, HTML.TAG_TD, RichFaces.NAME_FACET_HEADER, CST_HEADER_CLASS, null, null, null, CST_HEADER_CELL_CLASS); /* * Encode children */ childrenEncoder.encodeChildren(); /* * Encode footer */ childrenEncoder.encodeTableFooter( pageContext, tbody, null, HTML.TAG_TD, RichFaces.NAME_FACET_FOOTER, CST_FOOTER_CLASS, null, null, null, CST_FOOTER_CELL_CLASS); return creationData; } @Override public void validate(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument, VpeCreationData creationData) { RichFacesDataTableChildrenEncoder.validateChildren( pageContext, sourceNode, visualDocument, creationData); /* * Apply css styles to the generated visual node. */ final RichFacesDataTableStyleClassesApplier styleClassesApplier = new RichFacesDataTableStyleClassesApplier(visualDocument, pageContext, sourceNode); styleClassesApplier.applyClasses((nsIDOMElement) creationData.getNode()); } /** * Method that is responsible for collapsing/expanding subtable * * @param sourceNode source node for the subtable * @param toggleId the id */ public void toggle(Node sourceNode, String toggleId) { /* * Collapsed state will be changed. * Then the whole template should be rebuilt to apply changes. */ if (RichFaces.readCollapsedStateFromSourceNode(sourceNode)) { sourceNode.setUserData(RichFaces.COLLAPSED_STATE, "false", null); //$NON-NLS-1$ } else { sourceNode.setUserData(RichFaces.COLLAPSED_STATE, "true", null); //$NON-NLS-1$ } } }