/******************************************************************************* * Copyright (c) 2006 Sybase, Inc. and others. * * All rights reserved. This program and the accompanying materials * are 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: * Sybase, Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import org.eclipse.jst.jsf.common.dom.TagIdentifier; import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants; import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory; import org.eclipse.jst.pagedesigner.IHTMLConstants; import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter; import org.eclipse.jst.pagedesigner.converter.ConvertPosition; import org.eclipse.jst.pagedesigner.converter.ConverterUtil; import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil; import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil; import org.w3c.dom.Element; import org.w3c.dom.Node; /** * @author mengbo * @version 1.5 * @deprecated Use DTTagConverter meta-data instead */ public class DataTableTagConverter extends AbstractTagConverter { private static final String FACET_NAME_HEADER = "header"; //$NON-NLS-1$ /** * @param host */ public DataTableTagConverter(Element host) { super(host); } /* * (non-Javadoc) * * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh() */ protected Element doConvertRefresh() { Element hostEle = getHostElement(); // Renders an HTML "table" element compliant with the HTML 401 specification. Element tableEle = createElement(IHTMLConstants.TAG_TABLE); // Any pass-through attributes are also rendered on the "table" element. JSFConverterUtil.copyAllAttributes(hostEle, tableEle, null); // Please consult the javadoc for UIData to supplement this specification. // If the "styleClass" attribute is specified, render its value as the value // of the "class" attribute on the "table" element. ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, tableEle, IHTMLConstants.ATTR_CLASS); tableEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS); List columns = findUIColumns(hostEle); // rendering the thead convertTHeader(hostEle, tableEle, columns, true); convertTBody(hostEle, tableEle, columns); // rendering the tfoot // Follow the same process as for the header, except replace "header" with // "footer", "th" with "td", "thead" with "tfoot", and "headerClass" with // "footerClass". Do not render any "scope" attribute for the footer. convertTHeader(hostEle, tableEle, columns, false); return tableEle; } /** * @param hostEle * @return */ private List findUIColumns(Element hostEle) { List result = new ArrayList(); Node child = hostEle.getFirstChild(); if (child != null) { while (child != null) { if (child instanceof Element) { Element ele = (Element) child; TagIdentifier tagId = TagIdentifierFactory.createDocumentTagWrapper(ele); if (IJSFConstants.TAG_IDENTIFIER_COLUMN.isSameTagType(tagId)) { result.add(ele); } } child = child.getNextSibling(); } } return result; } /** * @param hostEle * @param tableEle * @param columns */ protected void convertTBody(Element hostEle, Element tableEle, List columns) { // Rendering the table body Element tbodyEle = createElement(IHTMLConstants.TAG_TBODY); tableEle.appendChild(tbodyEle); // Render a "tbody" element. Keep track of the result of the "rows" property // on the UIData component. Keep track of the number of rows we have rendered // so far. // Iterate through the rows. Set the "rowIndex" property of the UIDatacomponent // to be correct as we iterate through the rows. // Stop rendering children and close out the "tbody" element if the "rowAvailable" // property of the UIData returned false. // XXX: we are only rendering one row. // Output a "tr" element. Element trEle = createElement(IHTMLConstants.TAG_TR); tbodyEle.appendChild(trEle); // Output the value of the "rowClasses" per the attribute description below. String rowClasses = tableEle.getAttribute(IJSFConstants.ATTR_ROWCLASSES); if (rowClasses != null) { // as we are only rendering one row, so we only get the first rowclass StringTokenizer tokenizer = new StringTokenizer(rowClasses, ", "); //$NON-NLS-1$ if (tokenizer.hasMoreTokens()) { trEle.setAttribute(IHTMLConstants.ATTR_CLASS, tokenizer.nextToken()); } } // --------------------------------- move this part into ColumnsTagConverter. ------------------------------ String columnClassesAttr = hostEle.getAttribute(IJSFConstants.ATTR_COLUMNCLASSES); List columnClasses = new ArrayList(); if (columnClassesAttr != null) { StringTokenizer tokenizer = new StringTokenizer(columnClassesAttr, ", "); //$NON-NLS-1$ while (tokenizer.hasMoreTokens()) { columnClasses.add(tokenizer.nextToken()); } } // --- create column's td in column tag converter, here // For each UIColumn child, output a "td" element, attaching the value of the // "columnClasses" attribute of the UIData component per the attribute description below. // Recursively encode each child of each UIColumn child. Close out the "td" element. // When done with the row, close out the "tr" element. When done with all the rows, // close out the "tbody" element. for (int i = 0, size = columns.size(); i < size; i++) { Element column = (Element) columns.get(i); addChild(column, new ConvertPosition(trEle, i)); // Element tdEle = createElement("td"); // if (i < columnClasses.size()) // { // tdEle.setAttribute("class", (String) columnClasses.get(i)); // } // // trEle.appendChild(tdEle); // // put the "h:column" under td. // addChild(column, new ConvertPosition(tdEle, 0)); } } /** * @param hostEle * @param tableEle * @param columns * @param header true means header, false means footer */ protected void convertTHeader(Element hostEle, Element tableEle, List columns, boolean header) { // If the UIData component has a "header" facet, or any of the child UIColumn // components has a "header" facet, render a "thead" element. Element facetEle = JSFDOMUtil.findFacet(hostEle, header ? FACET_NAME_HEADER : "footer"); //$NON-NLS-1$ boolean hasColHeader = false; for (int i = 0, size = columns.size(); i < size; i++) { Element uicolumnEle = (Element) columns.get(i); Element columnFacet = JSFDOMUtil.findFacet(uicolumnEle, header ? FACET_NAME_HEADER : "footer"); //$NON-NLS-1$ if (columnFacet != null) { hasColHeader = true; break; } } if (facetEle == null && !hasColHeader) { return; } Element theadEle = createElement(header ? IHTMLConstants.TAG_THEAD : IHTMLConstants.TAG_TFOOT); tableEle.appendChild(theadEle); // If the UIData component has a "header" facet, encode its contents inside of // "tr" and "th" elements, respectively. if (facetEle != null) { Element trEle = createElement(IHTMLConstants.TAG_TR); theadEle.appendChild(trEle); Element thEle = createElement(header ? IHTMLConstants.TAG_TH : IHTMLConstants.TAG_TD); trEle.appendChild(thEle); // Output the value of the "headerClass" attribute of the UIData component, // if present, as the value of the "class" attribute on the "th". ConverterUtil.copyAttribute(hostEle, header ? IJSFConstants.ATTR_HEADERCLASS : IJSFConstants.ATTR_FOOTERCLASS, thEle, IHTMLConstants.ATTR_CLASS); // Output the number of child UIColumn components of theUIData component as // the value of the "colspan" attribute on the "th". if (columns.size() > 0) { thEle.setAttribute(IHTMLConstants.ATTR_COLSPAN, String.valueOf(columns.size())); } addChild(facetEle, new ConvertPosition(thEle, 0)); } // Output "colgroup" as the value of the "scope" attribute on the "th" element. // If any of the child UIColumn components has a "header" facet render a "tr" // element. if (hasColHeader) { Element trEle = createElement(IHTMLConstants.TAG_TR); theadEle.appendChild(trEle); for (int i = 0, size = columns.size(); i < size; i++) { Element uicolumnEle = (Element) columns.get(i); Element columnFacet = JSFDOMUtil.findFacet(uicolumnEle, header ? FACET_NAME_HEADER : "footer"); //$NON-NLS-1$ Element thEle = createElement(header ? IHTMLConstants.TAG_TH : IHTMLConstants.TAG_TD); trEle.appendChild(thEle); if (columnFacet != null) { // For eachUIColumn that actually has a "header" facet, render it inside of // a "th" element. addChild(columnFacet, new ConvertPosition(thEle, 0)); } else { // Columns that don't have a "header" facet cause an empty "th" element to be // rendered. } // Output the value of the "headerClass" attribute of the UIData component, // if present, as the value of the "class" attribute on the "th". ConverterUtil.copyAttribute(hostEle, header ? IJSFConstants.ATTR_HEADERCLASS : IJSFConstants.ATTR_FOOTERCLASS, thEle, IHTMLConstants.ATTR_CLASS); // Output "col" as the value of the "colgroup" attribute on the "th" element. } } } /* * (non-Javadoc) * * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel() */ public boolean isMultiLevel() { return true; } /* * (non-Javadoc) * * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget() */ public boolean isWidget() { return false; } /* * (non-Javadoc) * * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator() */ public boolean needBorderDecorator() { return false; } /* * (non-Javadoc) * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needTableDecorator() */ public boolean needTableDecorator() { return true; } }