/******************************************************************************* * 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.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.template.expression.VpeExpression; import org.jboss.tools.vpe.editor.template.expression.VpeExpressionException; 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.jboss.tools.vpe.editor.util.VpeClassUtil; import org.mozilla.interfaces.nsIDOMDocument; import org.mozilla.interfaces.nsIDOMElement; import org.w3c.dom.Element; import org.w3c.dom.Node; /** * Creates rich:dataDefinitionList template. * * @author Max Areshkau * */ public class RichFacesDataDefinitionListTemplate extends VpeAbstractTemplate { /** * CSS settings */ private static final String DEFAULT_DD_CLASS = "columnClass"; //$NON-NLS-1$ private static final String STYLE_RESOURCES_PATH = "/dataDefinitionList/dataDefinitionList.css"; //$NON-NLS-1$ /** * Creates a node of the visual tree on the node of the source tree. This * visual node should not have the parent node This visual node can have * child nodes. * * @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. * @return The information on the created node of the visual tree. */ public VpeCreationData create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument) { Element sourceElement = (Element) sourceNode; nsIDOMElement listElement = visualDocument.createElement(HTML.TAG_DL); ComponentUtil.setCSSLink( pageContext, STYLE_RESOURCES_PATH, "dataDefinitionList"); //$NON-NLS-1$ VpeCreationData creationData = new VpeCreationData(listElement); creationData.addChildrenInfo(new VpeChildrenInfo(null)); // sets attributes for list ComponentUtil.correctAttribute((Element)sourceNode, listElement, RichFaces.ATTR_STYLE, HTML.ATTR_STYLE, null, null); ComponentUtil.correctAttribute((Element)sourceNode, listElement, RichFaces.ATTR_STYLE_CLASS, HTML.ATTR_CLASS, null, "listClass"); //$NON-NLS-1$ Element termFacet = SourceDomUtil.getFacetByName(pageContext, sourceElement, RichFaces.NAME_FACET_TERM); Map<String, List<Node>> termFacetChildren = VisualDomUtil .findFacetElements(termFacet, pageContext); Node termNode= ComponentUtil.getFacetBody(termFacetChildren); /* * Encode body of the tag. * Add text nodes to children list also. */ List<Node> children = ComponentUtil.getChildren(sourceElement, true); final List<String> rowClasses; try { final VpeExpression exprRowClasses = RichFaces.getExprRowClasses(); rowClasses = VpeClassUtil.getClasses(exprRowClasses, sourceNode, pageContext); } catch (VpeExpressionException e) { throw new RuntimeException(e); } final int rowClassesSize = rowClasses.size(); int rows = 1; try { rows = Integer.parseInt(((Element)sourceNode).getAttribute(RichFaces.ATTR_ROWS)); } catch (NumberFormatException x) { // this is OK, rows still equals 1 } VpeChildrenInfo childInfo = null; for (int row = 0; row < rows; row++) { if (termNode != null) { insertDtElement(sourceNode, visualDocument, creationData, listElement, termNode); } if ((termFacetChildren.get(VisualDomUtil.FACET_HTML_TAGS).size() > 0) || !children.isEmpty()) { String ddClass = DEFAULT_DD_CLASS; if (rowClassesSize > 0) { ddClass+= " " + rowClasses.get(row % rowClassesSize); //$NON-NLS-1$ } nsIDOMElement dd = visualDocument.createElement(HTML.TAG_DD); dd.setAttribute(HTML.ATTR_CLASS, ddClass); listElement.appendChild(dd); childInfo = new VpeChildrenInfo(dd); for (Node child : termFacetChildren.get(VisualDomUtil.FACET_HTML_TAGS)) { childInfo.addSourceChild(child); } for (Node child : children) { childInfo.addSourceChild(child); } creationData.addChildrenInfo(childInfo); } } return creationData; } /** * Insert listDataDefinition facet to HTML DT element * * @param sourceNode * The current node of the source tree. * @param visualDocument * The document of the visual tree. * @param creationData * @param parentList * @facet facetElement */ private void insertDtElement(Node sourceNode, nsIDOMDocument visualDocument, VpeCreationData creationData, nsIDOMElement parentList, Node facetElement) { nsIDOMElement dt = visualDocument.createElement(HTML.TAG_DT); ComponentUtil.correctAttribute( (Element) sourceNode, dt, RichFaces.ATTR_HEADER_CLASS, HTML.ATTR_CLASS, null, "headerClass"); //$NON-NLS-1$ parentList.appendChild(dt); VpeChildrenInfo child = new VpeChildrenInfo(dt); child.addSourceChild(facetElement); creationData.addChildrenInfo(child); } /** * @see VpeAbstractTemplate#isRecreateAtAttrChange */ @Override public boolean recreateAtAttrChange(VpePageContext pageContext, Element sourceElement, nsIDOMDocument visualDocument, nsIDOMElement visualNode, Object data, String name, String value) { return true; } // @Override // public void setAttribute(VpePageContext pageContext, Element sourceElement, nsIDOMDocument visualDocument, nsIDOMNode visualNode, Object data, String name, // String value) { // processAttributeChanges(pageContext, sourceElement, visualDocument, visualNode, data, name); // } // // @Override // public void removeAttribute(VpePageContext pageContext, Element sourceElement, nsIDOMDocument visualDocument, nsIDOMNode visualNode, Object data, String name) { // processAttributeChanges(pageContext, sourceElement, visualDocument, visualNode, data, name); // } // // /** // * Correct list style accordinly parameters // * // * @param pageContext // * Contains the information on edited page. // * @param sourceElement // * The current node of the source tree. // * @param visualDocument // * The document of the visual tree. // * @param visualNode // * @param data // * @param name // */ // private void processAttributeChanges(VpePageContext pageContext, Element sourceElement, nsIDOMDocument visualDocument, nsIDOMNode visualNode, Object data, String name) { // nsIDOMElement el = queryInterface(visualNode, nsIDOMElement.class); // if (HTML.ATTR_STYLE.equals(name)) { // ComponentUtil.correctAttribute(sourceElement, el, name, name, null, null); // } else if (RichFaces.ATTR_STYLE_CLASS.equals(name)) { // ComponentUtil.correctAttribute(sourceElement, el, name, // HTML.ATTR_CLASS, null, "listClass"); // } else if (RichFaces.ATTR_HEADER_CLASS.equals(name)) { // nsIDOMNodeList nodeList = el.getChildNodes(); // nsIDOMNode temp = null; // for (int i = 0; i < nodeList.getLength(); i++) { // temp = nodeList.item(i); // if ((temp != null) // && (temp.getNodeName() // .equalsIgnoreCase(HTML.TAG_DT))) { // nsIDOMElement tempVisualElement = queryInterface(temp, nsIDOMElement.class); // ComponentUtil.correctAttribute(sourceElement, // tempVisualElement, // RichFaces.ATTR_HEADER_CLASS, // HTML.ATTR_CLASS, // null, // "headerClass"); // } // } // } else if (RichFaces.ATTR_ROW_CLASSES.equals(name)) { // nsIDOMNodeList nodeList = el.getChildNodes(); // nsIDOMNode temp = null; // for (int i = 0; i < nodeList.getLength(); i++) { // temp = nodeList.item(i); // if ((temp != null ) // && (temp.getNodeName() // .equalsIgnoreCase(HTML.TAG_DD))) { // nsIDOMElement tempVisualElement = queryInterface(temp, nsIDOMElement.class); // ComponentUtil.correctAttribute(sourceElement, // tempVisualElement, // RichFaces.ATTR_ROW_CLASSES, // HTML.ATTR_CLASS, // null, // "columnClass"); // } // } // } else if (RichFaces.ATTR_COLUMN_CLASSES.equals(name)) { // nsIDOMNodeList nodeList = el.getChildNodes(); // nsIDOMNode temp = null; // for (int i = 0; i < nodeList.getLength(); i++) { // temp = nodeList.item(i); // if ((temp != null) // && (temp.getNodeName() // .equalsIgnoreCase(HTML.TAG_DD))) { // nsIDOMElement tempVisualElement = queryInterface(temp, nsIDOMElement.class); // ComponentUtil.correctAttribute( // sourceElement, // tempVisualElement, // RichFaces.ATTR_COLUMN_CLASSES, // HTML.ATTR_CLASS, // null, // "columnClass"); // } // } // } // } }