📄 htmltreerenderer.java
字号:
/* * Copyright 2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.myfaces.custom.tree.renderkit.html;import org.apache.myfaces.custom.tree.HtmlTree;import org.apache.myfaces.custom.tree.HtmlTreeColumn;import org.apache.myfaces.custom.tree.HtmlTreeImageCommandLink;import org.apache.myfaces.custom.tree.HtmlTreeNode;import org.apache.myfaces.custom.tree.IconProvider;import org.apache.myfaces.custom.tree.TreeNode;import org.apache.myfaces.renderkit.RendererUtils;import org.apache.myfaces.renderkit.html.HTML;import org.apache.myfaces.renderkit.html.HtmlRendererUtils;import org.apache.myfaces.renderkit.html.HtmlTableRendererBase;import org.apache.myfaces.util.ArrayUtils;import org.apache.myfaces.util.StringUtils;import javax.faces.component.UIColumn;import javax.faces.component.UIComponent;import javax.faces.context.FacesContext;import javax.faces.context.ResponseWriter;import java.io.IOException;import java.util.ArrayList;import java.util.Iterator;import java.util.List;/** * @author <a href="mailto:oliver@rossmueller.com">Oliver Rossmueller </a> * @version $Revision: 1.16 $ $Date: 2005/02/11 00:54:02 $ * * $Log: HtmlTreeRenderer.java,v $ * Revision 1.16 2005/02/11 00:54:02 svieujot * Revert changes commited to the wrong branch. * * Revision 1.14 2004/12/24 14:13:16 svieujot * Upgrade the tree component to use the Extensions filter. * * Revision 1.13 2004/12/22 17:52:54 grantsmith * Jira MYFACES-48: Tree Table Component Fixes & Tree Checkbox Support * * Revision 1.12 2004/11/26 12:46:38 oros * cleanup: removed unused iconChild attribute * * Revision 1.11 2004/11/26 12:14:09 oros * MYFACES-8: applied tree table patch by David Le Strat * * */public class HtmlTreeRenderer extends HtmlTableRendererBase{ private static final Integer ZERO = new Integer(0); private static final String DEFAULT_IMAGE_ICON_FOLDER = "images/folder.gif"; public boolean getRendersChildren() { return true; } public void encodeBegin(FacesContext facesContext, UIComponent uiComponent) throws IOException { // Rendering occurs in encodeEnd. } public void encodeChildren(FacesContext facesContext, UIComponent component) throws IOException { // children are rendered in encodeEnd } public void encodeEnd(FacesContext facesContext, UIComponent component) throws IOException { RendererUtils.checkParamValidity(facesContext, component, HtmlTree.class); ResponseWriter writer = facesContext.getResponseWriter(); HtmlTree tree = (HtmlTree) component; HtmlRendererUtils.writePrettyLineSeparator(facesContext); writer.startElement(HTML.TABLE_ELEM, null); HtmlRendererUtils.renderHTMLAttributes(writer, tree, HTML.TABLE_PASSTHROUGH_ATTRIBUTES); writer.writeAttribute(HTML.BORDER_ATTR, ZERO, null); writer.writeAttribute(HTML.CELLSPACING_ATTR, ZERO, null); writer.writeAttribute(HTML.CELLPADDING_ATTR, ZERO, null); int maxLevel = tree.getRootNode().getMaxChildLevel(); // Create initial children list from root node facet ArrayList childNodes = new ArrayList(1); childNodes.add(tree.getRootNode()); // Render header. renderFacet(facesContext, writer, component, true, maxLevel); // Render children. renderChildren(facesContext, writer, tree, childNodes, maxLevel, tree.getIconProvider()); // Render footer. renderFacet(facesContext, writer, component, false, maxLevel); writer.endElement(HTML.TABLE_ELEM); } /** * <p> * Overrides super renderFacet to render the {@link HtmlTree} facets. * <p> * * @param facesContext The facesContext * @param writer The writer. * @param component The component. * @param header Whether there is a header. * @param maxLevel The max level for the rendered tree. * @throws IOException Throws IOException. */ protected void renderFacet(FacesContext facesContext, ResponseWriter writer, UIComponent component, boolean header, int maxLevel) throws IOException { int colspan = 0; boolean hasColumnFacet = false; for (Iterator it = component.getChildren().iterator(); it.hasNext();) { UIComponent uiComponent = (UIComponent) it.next(); if ((uiComponent.getFamily().equals(UIColumn.COMPONENT_FAMILY)) && ((UIColumn) uiComponent).isRendered()) { colspan++; if (!hasColumnFacet) { hasColumnFacet = header ? ((UIColumn) uiComponent).getHeader() != null : ((UIColumn) uiComponent) .getFooter() != null; } } else if ((uiComponent.getFamily().equals(HtmlTreeColumn.COMPONENT_FAMILY)) && ((HtmlTreeColumn) uiComponent).isRendered()) { colspan += maxLevel + 3; if (!hasColumnFacet) { hasColumnFacet = header ? ((UIColumn) uiComponent).getHeader() != null : ((UIColumn) uiComponent) .getFooter() != null; } } } UIComponent facet = header ? (UIComponent) component.getFacets().get(HEADER_FACET_NAME) : (UIComponent) component.getFacets().get(FOOTER_FACET_NAME); if (facet != null || hasColumnFacet) { // Header or Footer present String elemName = header ? HTML.THEAD_ELEM : HTML.TFOOT_ELEM; HtmlRendererUtils.writePrettyLineSeparator(facesContext); writer.startElement(elemName, component); if (header) { String headerStyleClass = getHeaderClass(component); if (facet != null) renderTableHeaderRow(facesContext, writer, component, facet, headerStyleClass, colspan); if (hasColumnFacet) renderColumnHeaderRow(facesContext, writer, component, headerStyleClass, maxLevel); } else { String footerStyleClass = getFooterClass(component); if (hasColumnFacet) renderColumnFooterRow(facesContext, writer, component, footerStyleClass, maxLevel); if (facet != null) renderTableFooterRow(facesContext, writer, component, facet, footerStyleClass, colspan); } writer.endElement(elemName); } } protected void renderColumnHeaderRow(FacesContext facesContext, ResponseWriter writer, UIComponent component, String headerStyleClass, int maxLevel) throws IOException { renderColumnHeaderOrFooterRow(facesContext, writer, component, headerStyleClass, true, maxLevel); } protected void renderColumnFooterRow(FacesContext facesContext, ResponseWriter writer, UIComponent component, String footerStyleClass, int maxLevel) throws IOException { renderColumnHeaderOrFooterRow(facesContext, writer, component, footerStyleClass, false, maxLevel); } private void renderColumnHeaderOrFooterRow(FacesContext facesContext, ResponseWriter writer, UIComponent component, String styleClass, boolean header, int maxLevel) throws IOException { HtmlRendererUtils.writePrettyLineSeparator(facesContext); writer.startElement(HTML.TR_ELEM, component); for (Iterator it = component.getChildren().iterator(); it.hasNext();) { UIComponent uiComponent = (UIComponent) it.next(); if ((uiComponent.getFamily().equals(UIColumn.COMPONENT_FAMILY)) && ((UIColumn) uiComponent).isRendered()) { if (header) { renderColumnHeaderCell(facesContext, writer, (UIColumn) uiComponent, styleClass, 0); } else { renderColumnFooterCell(facesContext, writer, (UIColumn) uiComponent, styleClass, 0); } } else if ((uiComponent.getFamily().equals(HtmlTreeColumn.COMPONENT_FAMILY)) && ((HtmlTreeColumn) uiComponent).isRendered()) { if (header) { renderColumnHeaderCell(facesContext, writer, (UIColumn) uiComponent, styleClass, maxLevel + 3); } else { renderColumnFooterCell(facesContext, writer, (UIColumn) uiComponent, styleClass, maxLevel + 3); } } } writer.endElement(HTML.TR_ELEM); } /** * <p> * Renders the children. * </p> * * @param facesContext The facesContext. * @param writer The writer. * @param tree The tree component. * @param children The children to render. * @param maxLevel The maximum level. * @param iconProvider The icon provider. * @throws IOException Throws an IOException. */ protected void renderChildren(FacesContext facesContext, ResponseWriter writer, HtmlTree tree, List children, int maxLevel, IconProvider iconProvider) throws IOException { renderChildren(facesContext, writer, tree, children, maxLevel, iconProvider, 0); } /** * <p> * Renders the children given the rowClassIndex. * </p> * * @param facesContext The facesContext. * @param writer The writer. * @param tree The tree component. * @param children The children to render. * @param maxLevel The maximum level. * @param iconProvider The icon provider. * @param rowClassIndex The row class index. * @throws IOException Throws an IOException. */ protected void renderChildren(FacesContext facesContext, ResponseWriter writer, HtmlTree tree, List children, int maxLevel, IconProvider iconProvider, int rowClassIndex) throws IOException { String rowClasses = tree.getRowClasses(); String columnClasses = tree.getColumnClasses(); String[] rowClassesArray = (rowClasses == null) ? ArrayUtils.EMPTY_STRING_ARRAY : StringUtils.trim(StringUtils .splitShortString(rowClasses, ',')); int rowClassesCount = rowClassesArray.length; String[] columnClassesArray = (columnClasses == null) ? ArrayUtils.EMPTY_STRING_ARRAY : StringUtils .trim(StringUtils.splitShortString(columnClasses, ',')); int columnClassesCount = columnClassesArray.length; int columnClassIndex = 0; for (Iterator it = children.iterator(); it.hasNext();)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -