You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by or...@apache.org on 2004/11/26 13:14:11 UTC

cvs commit: incubator-myfaces/webapps/tiles/web/WEB-INF .cvsignore

oros        2004/11/26 04:14:11

  Modified:    conf     faces-config.xml
               src/components/org/apache/myfaces/custom/tree/renderkit/html
                        HtmlTreeNodeRenderer.java HtmlTreeRenderer.java
               src/components/org/apache/myfaces/custom/tree/taglib
                        TreeTag.java
               src/components/org/apache/myfaces/custom/tree
                        DefaultMutableTreeNode.java HtmlTree.java
                        HtmlTreeNode.java Tree.xml TreeNode.java
               src/share/org/apache/myfaces/renderkit/html
                        HtmlTableRendererBase.java
               tlds     myfaces_ext.tld
               webapps/examples/src/org/apache/myfaces/examples/resource
                        example_messages.properties
               webapps/examples/web/WEB-INF examples-config.xml
               webapps/examples/web/css basic.css
               webapps/examples/web/inc page_header.jsp
               webapps/tiles/web/WEB-INF .cvsignore
  Added:       src/components/org/apache/myfaces/custom/tree
                        HtmlTreeColumn.java HtmlTreeColumn.xml
               webapps/examples/web treeTable.jsp
  Log:
  MYFACES-8: applied tree table patch by David Le Strat
  
  Revision  Changes    Path
  1.98      +6 -1      incubator-myfaces/conf/faces-config.xml
  
  Index: faces-config.xml
  ===================================================================
  RCS file: /home/cvs/incubator-myfaces/conf/faces-config.xml,v
  retrieving revision 1.97
  retrieving revision 1.98
  diff -u -r1.97 -r1.98
  --- faces-config.xml	20 Nov 2004 20:15:58 -0000	1.97
  +++ faces-config.xml	26 Nov 2004 12:14:09 -0000	1.98
  @@ -175,9 +175,14 @@
         <component-class>org.apache.myfaces.custom.tree.HtmlTreeNode</component-class>
     </component>
   
  -   <component>
  +  <component>
         <component-type>org.apache.myfaces.HtmlTreeImageCommandLink</component-type>
         <component-class>org.apache.myfaces.custom.tree.HtmlTreeImageCommandLink</component-class>
  +  </component>
  +
  +  <component>
  +      <component-type>org.apache.myfaces.HtmlTreeColumn</component-type>
  +      <component-class>org.apache.myfaces.custom.tree.HtmlTreeColumn</component-class>
     </component>
   
     <component>
  
  
  
  1.8       +6 -1      incubator-myfaces/src/components/org/apache/myfaces/custom/tree/renderkit/html/HtmlTreeNodeRenderer.java
  
  Index: HtmlTreeNodeRenderer.java
  ===================================================================
  RCS file: /home/cvs/incubator-myfaces/src/components/org/apache/myfaces/custom/tree/renderkit/html/HtmlTreeNodeRenderer.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- HtmlTreeNodeRenderer.java	13 Oct 2004 11:50:58 -0000	1.7
  +++ HtmlTreeNodeRenderer.java	26 Nov 2004 12:14:09 -0000	1.8
  @@ -25,7 +25,12 @@
   /**
    * @author <a href="mailto:oliver@rossmueller.com">Oliver Rossmueller</a>
    * @version $Revision$ $Date$
  + *
  + * 
    *          $Log$
  + *          Revision 1.8  2004/11/26 12:14:09  oros
  + *          MYFACES-8: applied tree table patch by David Le Strat
  + *
    *          Revision 1.7  2004/10/13 11:50:58  matze
    *          renamed packages to org.apache
    *
  
  
  
  1.11      +402 -165  incubator-myfaces/src/components/org/apache/myfaces/custom/tree/renderkit/html/HtmlTreeRenderer.java
  
  Index: HtmlTreeRenderer.java
  ===================================================================
  RCS file: /home/cvs/incubator-myfaces/src/components/org/apache/myfaces/custom/tree/renderkit/html/HtmlTreeRenderer.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- HtmlTreeRenderer.java	13 Oct 2004 11:50:58 -0000	1.10
  +++ HtmlTreeRenderer.java	26 Nov 2004 12:14:09 -0000	1.11
  @@ -16,77 +16,58 @@
   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.HtmlRenderer;
   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>
  + * @author <a href="mailto:oliver@rossmueller.com">Oliver Rossmueller </a>
    * @version $Revision$ $Date$
  - *          $Log$
  - *          Revision 1.10  2004/10/13 11:50:58  matze
  - *          renamed packages to org.apache
  - *
  - *          Revision 1.9  2004/07/18 21:36:25  o_rossmueller
  - *          fix #991740: getResourceURL for tree image urls
  - *
  - *          Revision 1.8  2004/07/01 21:53:10  mwessendorf
  - *          ASF switch
    *
  - *          Revision 1.7  2004/05/27 15:06:39  manolito
  - *          bugfix: node labels not rendered any more
  - *
  - *          Revision 1.6  2004/05/12 02:27:43  o_rossmueller
  - *          fix #951896: tree component works for JAVASCRIPT=false, too
  - *
  - *          Revision 1.5  2004/05/10 01:24:51  o_rossmueller
  - *          added iconClass attribute
  - *
  - *          Revision 1.4  2004/05/04 12:19:13  o_rossmueller
  - *          added icon provider
  + *          $Log$
  + *          Revision 1.11  2004/11/26 12:14:09  oros
  + *          MYFACES-8: applied tree table patch by David Le Strat
  + * 
    *
  - *          Revision 1.3  2004/04/23 19:09:34  o_rossmueller
  - *          state transition magic
  - *          <p/>
  - *          Revision 1.2  2004/04/22 12:57:39  o_rossmueller
  - *          fixed leaf node layout
  - *          <p/>
  - *          Revision 1.1  2004/04/22 10:20:24  manolito
  - *          tree component
    */
  -public class HtmlTreeRenderer
  -    extends HtmlRenderer
  +public class HtmlTreeRenderer extends HtmlTableRendererBase
   {
   
       private static final Integer ZERO = new Integer(0);
   
  -
       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
       {
  -        //super.encodeChildren(facesContext, component);
           // children are rendered in encodeEnd
       }
   
  -
       public void encodeEnd(FacesContext facesContext, UIComponent component) throws IOException
       {
           RendererUtils.checkParamValidity(facesContext, component, HtmlTree.class);
  @@ -102,30 +83,192 @@
   
           int maxLevel = tree.getRootNode().getMaxChildLevel();
   
  -        // create initial children list from root node facet
  +        // 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());
   
  -        HtmlRendererUtils.writePrettyLineSeparator(facesContext);
  +        // Render footer.
  +        renderFacet(facesContext, writer, component, false, maxLevel);
           writer.endElement(HTML.TABLE_ELEM);
  -        super.encodeEnd(facesContext, component);
       }
   
  +    /**
  +     * <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;
   
  -    protected void renderChildren(FacesContext facesContext,
  -                                  ResponseWriter writer,
  -                                  HtmlTree tree,
  -                                  List children,
  -                                  int maxLevel,
  -                                  IconProvider iconProvider) throws IOException
  +            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
       {
  -        String iconClass = tree.getIconClass();
  +        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();)
           {
               HtmlTreeNode child = (HtmlTreeNode) it.next();
  +
               if (!child.isRendered())
               {
                   continue;
  @@ -134,138 +277,233 @@
   
               writer.startElement(HTML.TR_ELEM, null);
   
  -            int[] layout = child.getLayout();
  +            if (rowClassIndex < rowClassesCount)
  +            {
  +                writer.writeAttribute(HTML.CLASS_ATTR, rowClassesArray[rowClassIndex], null);
  +            }
  +            if (rowClassesCount > 0)
  +            {
  +                rowClassIndex++;
  +                rowClassIndex = rowClassIndex % rowClassesCount;
  +            }
   
  -            // tree lines
  -            for (int i = 0; i < layout.length - 1; i++)
  +            if (null != tree.getVar())
               {
  -                int state = layout[i];
  -                writer.startElement(HTML.TD_ELEM, null);
  -                String url = getLayoutImage(tree, state);
  +                facesContext.getExternalContext().getRequestMap().put(tree.getVar(),
  +                        ((TreeNode) child.getUserObject()).getUserObject());
  +            }
   
  -                if ((url != null) && (url.length() > 0))
  +            List componentChildren = tree.getChildren();
  +            if ((null != componentChildren) && (componentChildren.size() > 0))
  +            {
  +                for (int j = 0, size = tree.getChildCount(); j < size; j++)
                   {
  -                    writer.startElement(HTML.IMG_ELEM, child);
  -
  -                    String src;
  -                    if (url.startsWith(HTML.HREF_PATH_SEPARATOR))
  +                    UIComponent componentChild = (UIComponent) componentChildren.get(j);
  +                    if ((componentChild.getFamily().equals(UIColumn.COMPONENT_FAMILY))
  +                            && ((UIColumn) componentChild).isRendered())
                       {
  -                        String path = facesContext.getExternalContext().getRequestContextPath();
  -                        src = path + url;
  -                    } else
  +                        writer.startElement(HTML.TD_ELEM, tree);
  +                        if (columnClassIndex < columnClassesCount)
  +                        {
  +                            writer.writeAttribute(HTML.CLASS_ATTR, columnClassesArray[columnClassIndex], null);
  +                        }
  +                        if (columnClassesCount > 0)
  +                        {
  +                            columnClassIndex++;
  +                            columnClassIndex = columnClassIndex % columnClassesCount;
  +                        }
  +                        RendererUtils.renderChild(facesContext, componentChild);
  +                        writer.endElement(HTML.TD_ELEM);
  +                    }
  +                    else if ((componentChild.getFamily().equals(HtmlTreeColumn.COMPONENT_FAMILY))
  +                            && ((HtmlTreeColumn) componentChild).isRendered())
                       {
  -                        src = url;
  +                        renderTreeColumnChild(facesContext, writer, componentChild, tree, child, maxLevel, iconProvider);
                       }
  -                    //Encode URL
  -                    //Although this is an url url, encodeURL is no nonsense, because the
  -                    //actual url url could also be a dynamic servlet request:
  -                    src = facesContext.getExternalContext().encodeResourceURL(src);
  -                    writer.writeAttribute(HTML.SRC_ATTR, src, null);
  -                    writer.writeAttribute(HTML.BORDER_ATTR, ZERO, null);
  +                }
  +            }
  +            else
  +            {
  +                renderTreeColumnChild(facesContext, writer, null, tree, child, maxLevel, iconProvider);
  +            }
   
  -                    HtmlRendererUtils.renderHTMLAttributes(writer, child, HTML.IMG_PASSTHROUGH_ATTRIBUTES);
  +            writer.endElement(HTML.TR_ELEM);
   
  -                    writer.endElement(HTML.IMG_ELEM);
  +            if (child.getChildCount() > 0)
  +            {
  +                renderChildren(facesContext, writer, tree, child.getChildren(), maxLevel, iconProvider, rowClassIndex);
  +                if (rowClassesCount > 0)
  +                {
  +                    rowClassIndex += (child.getChildCount() % rowClassesCount);
  +                    rowClassIndex = rowClassIndex % rowClassesCount;
                   }
  -                writer.endElement(HTML.TD_ELEM);
  -
               }
  +        }
  +    }
   
  -            // command link
  +    /**
  +     * <p>
  +     * Render the column where the tree is displayed.
  +     * </p>
  +     * 
  +     * @param facesContext The facesContext.
  +     * @param writer The writer.
  +     * @param component The component that will contain the tree. Null for
  +     *            default tree or {@link HtmlTreeColumn}for table rendering.
  +     * @param tree The tree,
  +     * @param child The tree node child.
  +     * @param maxLevel The max number of levels.
  +     * @param iconProvider The iconProvider.
  +     * @throws IOException Throws IOException.
  +     */
  +    protected void renderTreeColumnChild(FacesContext facesContext, ResponseWriter writer, UIComponent component,
  +            HtmlTree tree, HtmlTreeNode child, int maxLevel, IconProvider iconProvider) throws IOException
  +    {
  +        String iconClass = tree.getIconClass();
  +        int[] layout = child.getLayout();
  +        // tree lines
  +        for (int i = 0; i < layout.length - 1; i++)
  +        {
  +            int state = layout[i];
               writer.startElement(HTML.TD_ELEM, null);
  -            int state = layout[layout.length - 1];
               String url = getLayoutImage(tree, state);
   
  -            if (state == HtmlTreeNode.CHILD || state == HtmlTreeNode.CHILD_FIRST || state == HtmlTreeNode.CHILD_SINGLE || state == HtmlTreeNode.CHILD_LAST)
  +            if ((url != null) && (url.length() > 0))
               {
  -                // no action, just img
  -
  +                writer.startElement(HTML.IMG_ELEM, child);
   
  -                writeImageElement(url, facesContext, writer, child);
  +                String src;
  +                if (url.startsWith(HTML.HREF_PATH_SEPARATOR))
  +                {
  +                    String path = facesContext.getExternalContext().getRequestContextPath();
  +                    src = path + url;
  +                }
  +                else
  +                {
  +                    src = url;
  +                }
  +                //Encode URL
  +                //Although this is an url url, encodeURL is no nonsense,
  +                // because the
  +                //actual url url could also be a dynamic servlet request:
  +                src = facesContext.getExternalContext().encodeResourceURL(src);
  +                writer.writeAttribute(HTML.SRC_ATTR, src, null);
  +                writer.writeAttribute(HTML.BORDER_ATTR, ZERO, null);
   
  -            } else
  -            {
  -                HtmlTreeImageCommandLink expandCollapse = (HtmlTreeImageCommandLink) child.getExpandCollapseCommand(facesContext);
  -                expandCollapse.setImage(getLayoutImage(tree, layout[layout.length - 1]));
  +                HtmlRendererUtils.renderHTMLAttributes(writer, child, HTML.IMG_PASSTHROUGH_ATTRIBUTES);
   
  -                expandCollapse.encodeBegin(facesContext);
  -                expandCollapse.encodeEnd(facesContext);
  +                writer.endElement(HTML.IMG_ELEM);
               }
               writer.endElement(HTML.TD_ELEM);
   
  +        }
   
  -            int labelColSpan = maxLevel - child.getLevel() + 1;
  +        // command link
  +        writer.startElement(HTML.TD_ELEM, null);
  +        int state = layout[layout.length - 1];
  +        String url = getLayoutImage(tree, state);
   
  -            // node icon
  -            if (iconProvider != null)
  -            {
  -                url = iconProvider.getIconUrl(child.getUserObject(), child.getChildCount(), child.isLeaf(facesContext));
  -            } else
  -            {
  -                if (!child.isLeaf(facesContext))
  -                {
  -                    // todo: icon provider
  -                    url = "images/tree/folder.gif";
  -                } else
  -                {
  -                    url = null;
  -                }
  -            }
  +        if (state == HtmlTreeNode.CHILD || state == HtmlTreeNode.CHILD_FIRST || state == HtmlTreeNode.CHILD_SINGLE
  +                || state == HtmlTreeNode.CHILD_LAST)
  +        {
  +            // no action, just img
  +            writeImageElement(url, facesContext, writer, child);
  +        }
  +        else
  +        {
  +            HtmlTreeImageCommandLink expandCollapse = (HtmlTreeImageCommandLink) child
  +                    .getExpandCollapseCommand(facesContext);
  +            expandCollapse.setImage(getLayoutImage(tree, layout[layout.length - 1]));
   
  -            if ((url != null) && (url.length() > 0))
  +            expandCollapse.encodeBegin(facesContext);
  +            expandCollapse.encodeEnd(facesContext);
  +        }
  +        writer.endElement(HTML.TD_ELEM);
  +
  +        int labelColSpan = maxLevel - child.getLevel() + 1;
  +
  +        // node icon
  +        if (iconProvider != null)
  +        {
  +            url = iconProvider.getIconUrl(child.getUserObject(), child.getChildCount(), child.isLeaf(facesContext));
  +        }
  +        else
  +        {
  +            if (!child.isLeaf(facesContext))
               {
  -                writer.startElement(HTML.TD_ELEM, null);
  -                if (iconClass != null) {
  -                    writer.writeAttribute(HTML.CLASS_ATTR, iconClass, null);
  -                }
  -                writeImageElement(url, facesContext, writer, child);
  -                writer.endElement(HTML.TD_ELEM);
  -            } else
  +                // todo: icon provider
  +                url = "images/tree/folder.gif";
  +            }
  +            else
               {
  -                // no icon, so label has more room
  -                labelColSpan++;
  +                url = null;
               }
  +        }
   
  -
  -            // node label
  +        if ((url != null) && (url.length() > 0))
  +        {
               writer.startElement(HTML.TD_ELEM, null);
  -            writer.writeAttribute(HTML.COLSPAN_ATTR, new Integer(labelColSpan), null);
  -            if (child.isSelected() && tree.getSelectedNodeClass() != null)
  -            {
  -                writer.writeAttribute(HTML.CLASS_ATTR, tree.getSelectedNodeClass(), null);
  -            } else if (!child.isSelected() && tree.getNodeClass() != null)
  +            if (iconClass != null)
               {
  -                writer.writeAttribute(HTML.CLASS_ATTR, tree.getNodeClass(), null);
  +                writer.writeAttribute(HTML.CLASS_ATTR, iconClass, null);
               }
  -            child.encodeBegin(facesContext);
  -            child.encodeEnd(facesContext);
  +            writeImageElement(url, facesContext, writer, child);
               writer.endElement(HTML.TD_ELEM);
  +        }
  +        else
  +        {
  +            // no icon, so label has more room
  +            labelColSpan++;
  +        }
   
  -            writer.endElement(HTML.TR_ELEM);
  +        // node label
  +        writer.startElement(HTML.TD_ELEM, null);
  +        writer.writeAttribute(HTML.COLSPAN_ATTR, new Integer(labelColSpan), null);
  +        if (child.isSelected() && tree.getSelectedNodeClass() != null)
  +        {
  +            writer.writeAttribute(HTML.CLASS_ATTR, tree.getSelectedNodeClass(), null);
  +        }
  +        else if (!child.isSelected() && tree.getNodeClass() != null)
  +        {
  +            writer.writeAttribute(HTML.CLASS_ATTR, tree.getNodeClass(), null);
  +        }
   
  -            if (child.getChildCount() > 0)
  +        List componentChildren = null;
  +        if (null != component)
  +        {
  +            componentChildren = component.getChildren();
  +        }
  +        if ((null != componentChildren) && (componentChildren.size() > 0))
  +        {
  +            for (int k = 0; k < componentChildren.size(); k++)
               {
  -                renderChildren(facesContext, writer, tree, child.getChildren(), maxLevel, iconProvider);
  +                RendererUtils.renderChild(facesContext, (UIComponent) componentChildren.get(k));
               }
           }
  +        else
  +        {
  +            child.encodeBegin(facesContext);
  +            child.encodeEnd(facesContext);
  +        }
  +        writer.endElement(HTML.TD_ELEM);
       }
   
  -
       private void writeImageElement(String url, FacesContext facesContext, ResponseWriter writer, HtmlTreeNode child)
  -        throws IOException
  +            throws IOException
       {
           writer.startElement(HTML.IMG_ELEM, child);
  -        String src =facesContext.getApplication().getViewHandler().getResourceURL(facesContext, url);
  -//        if (url.startsWith(HTML.HREF_PATH_SEPARATOR))
  -//        {
  -//            String path = facesContext.getExternalContext().getRequestContextPath();
  -//            src = path + url;
  -//        } else
  -//        {
  -//            src = url;
  -//        }
  -//        //Encode URL
  -//        src = facesContext.getExternalContext().encodeResourceURL(src);
  +        String src = facesContext.getApplication().getViewHandler().getResourceURL(facesContext, url);
  +        //        if (url.startsWith(HTML.HREF_PATH_SEPARATOR))
  +        //        {
  +        //            String path =
  +        // facesContext.getExternalContext().getRequestContextPath();
  +        //            src = path + url;
  +        //        } else
  +        //        {
  +        //            src = url;
  +        //        }
  +        //        //Encode URL
  +        //        src = facesContext.getExternalContext().encodeResourceURL(src);
           writer.writeAttribute(HTML.SRC_ATTR, src, null);
           writer.writeAttribute(HTML.BORDER_ATTR, ZERO, null);
   
  @@ -274,41 +512,40 @@
           writer.endElement(HTML.IMG_ELEM);
       }
   
  -
       protected String getLayoutImage(HtmlTree tree, int state)
       {
           switch (state)
           {
  -            case HtmlTreeNode.OPEN:
  -                return tree.getIconNodeOpenMiddle();
  -            case HtmlTreeNode.OPEN_FIRST:
  -                return tree.getIconNodeOpenFirst();
  -            case HtmlTreeNode.OPEN_LAST:
  -                return tree.getIconNodeOpenLast();
  -            case HtmlTreeNode.OPEN_SINGLE:
  -                return tree.getIconNodeOpen();
  -            case HtmlTreeNode.CLOSED:
  -                return tree.getIconNodeCloseMiddle();
  -            case HtmlTreeNode.CLOSED_FIRST:
  -                return tree.getIconNodeCloseFirst();
  -            case HtmlTreeNode.CLOSED_LAST:
  -                return tree.getIconNodeCloseLast();
  -            case HtmlTreeNode.CLOSED_SINGLE:
  -                return tree.getIconNodeClose();
  -            case HtmlTreeNode.CHILD:
  -                return tree.getIconChildMiddle();
  -            case HtmlTreeNode.CHILD_FIRST:
  -                return tree.getIconChildFirst();
  -            case HtmlTreeNode.CHILD_LAST:
  -                return tree.getIconChildLast();
  -            case HtmlTreeNode.CHILD_SINGLE:
  -                return tree.getIconChild();
  -            case HtmlTreeNode.LINE:
  -                return tree.getIconLine();
  -            case HtmlTreeNode.EMPTY:
  -                return tree.getIconNoline();
  -            default:
  -                return tree.getIconNoline();
  +        case HtmlTreeNode.OPEN:
  +            return tree.getIconNodeOpenMiddle();
  +        case HtmlTreeNode.OPEN_FIRST:
  +            return tree.getIconNodeOpenFirst();
  +        case HtmlTreeNode.OPEN_LAST:
  +            return tree.getIconNodeOpenLast();
  +        case HtmlTreeNode.OPEN_SINGLE:
  +            return tree.getIconNodeOpen();
  +        case HtmlTreeNode.CLOSED:
  +            return tree.getIconNodeCloseMiddle();
  +        case HtmlTreeNode.CLOSED_FIRST:
  +            return tree.getIconNodeCloseFirst();
  +        case HtmlTreeNode.CLOSED_LAST:
  +            return tree.getIconNodeCloseLast();
  +        case HtmlTreeNode.CLOSED_SINGLE:
  +            return tree.getIconNodeClose();
  +        case HtmlTreeNode.CHILD:
  +            return tree.getIconChildMiddle();
  +        case HtmlTreeNode.CHILD_FIRST:
  +            return tree.getIconChildFirst();
  +        case HtmlTreeNode.CHILD_LAST:
  +            return tree.getIconChildLast();
  +        case HtmlTreeNode.CHILD_SINGLE:
  +            return tree.getIconChild();
  +        case HtmlTreeNode.LINE:
  +            return tree.getIconLine();
  +        case HtmlTreeNode.EMPTY:
  +            return tree.getIconNoline();
  +        default:
  +            return tree.getIconNoline();
           }
       }
  -}
  +}
  \ No newline at end of file
  
  
  
  1.8       +99 -70    incubator-myfaces/src/components/org/apache/myfaces/custom/tree/taglib/TreeTag.java
  
  Index: TreeTag.java
  ===================================================================
  RCS file: /home/cvs/incubator-myfaces/src/components/org/apache/myfaces/custom/tree/taglib/TreeTag.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- TreeTag.java	13 Oct 2004 11:50:58 -0000	1.7
  +++ TreeTag.java	26 Nov 2004 12:14:10 -0000	1.8
  @@ -26,40 +26,24 @@
   import javax.faces.el.ValueBinding;
   import javax.servlet.jsp.JspException;
   
  -
   /**
  + * <p>
    * HtmlTree tag.
  + * </p>
    * 
  - * @author <a href="mailto:oliver@rossmueller.com">Oliver Rossmueller</a>
  - * @version $Revision$ $Date$
  - *          $Log$
  - *          Revision 1.7  2004/10/13 11:50:58  matze
  - *          renamed packages to org.apache
  - *
  - *          Revision 1.6  2004/08/15 15:28:04  o_rossmueller
  - *          new model listener handling to get modified from events which occur outside the scope of a tree request
  - *
  - *          Revision 1.5  2004/07/01 21:53:06  mwessendorf
  - *          ASF switch
  - *
  - *          Revision 1.4  2004/05/10 01:24:51  o_rossmueller
  - *          added iconClass attribute
  - *
  - *          Revision 1.3  2004/05/05 00:18:57  o_rossmueller
  - *          various fixes/modifications in model event handling and tree update
  - *
  - *          Revision 1.2  2004/04/22 21:59:17  o_rossmueller
  - *          added expandRoot attribute
  - *
  - *          Revision 1.1  2004/04/22 10:20:25  manolito
  - *          tree component
  + * @author <a href="mailto:oliver@rossmueller.com">Oliver Rossmueller </a>
  + * @version $Revision$ $Date: 2004/10/13 11:50:58
    *
  + *          $ $Log$
  + *          $ Revision 1.8  2004/11/26 12:14:10  oros
  + *          $ MYFACES-8: applied tree table patch by David Le Strat
  + *          $
    */
  -public class TreeTag
  -        extends UIComponentTagBase
  +public class TreeTag extends UIComponentTagBase
   {
   
       private String value;
  +    private String var;
       private String iconLine;
       private String iconNoline;
       private String iconChild;
  @@ -75,6 +59,10 @@
       private String iconNodeCloseMiddle;
       private String iconNodeCloseLast;
       private String styleClass;
  +    private String rowClasses;
  +    private String columnClasses;
  +    private String headerClass;
  +    private String footerClass;
       private String nodeClass;
       private String selectedNodeClass;
       private String iconClass;
  @@ -87,265 +75,301 @@
           return "org.apache.myfaces.HtmlTree";
       }
   
  -
       public String getRendererType()
       {
           return "org.apache.myfaces.HtmlTree";
       }
   
  -
       public String getValue()
       {
           return value;
       }
   
  -
       public void setValue(String newValue)
       {
           value = newValue;
       }
   
  +    /**
  +     * @return Returns the var.
  +     */
  +    public String getVar()
  +    {
  +        return var;
  +    }
  +
  +    /**
  +     * @param var The var to set.
  +     */
  +    public void setVar(String var)
  +    {
  +        this.var = var;
  +    }
   
       public String getIconLine()
       {
           return iconLine;
       }
   
  -
       public void setIconLine(String iconLine)
       {
           this.iconLine = iconLine;
       }
   
  -
       public String getIconNoline()
       {
           return iconNoline;
       }
   
  -
       public void setIconNoline(String iconNoline)
       {
           this.iconNoline = iconNoline;
       }
   
  -
       public String getIconChild()
       {
           return iconChild;
       }
   
  -
       public void setIconChild(String iconChild)
       {
           this.iconChild = iconChild;
       }
   
  +    /**
  +     * @return Returns the rowClasses.
  +     */
  +    public String getRowClasses()
  +    {
  +        return rowClasses;
  +    }
  +
  +    /**
  +     * @param rowClasses The rowClasses to set.
  +     */
  +    public void setRowClasses(String rowClasses)
  +    {
  +        this.rowClasses = rowClasses;
  +    }
  +
  +    /**
  +     * @return Returns the columnClasses.
  +     */
  +    public String getColumnClasses()
  +    {
  +        return columnClasses;
  +    }
  +
  +    /**
  +     * @param columnClasses The columnClasses to set.
  +     */
  +    public void setColumnClasses(String columnClasses)
  +    {
  +        this.columnClasses = columnClasses;
  +    }
   
       public String getIconChildFirst()
       {
           return iconChildFirst;
       }
   
  -
       public void setIconChildFirst(String iconChildFirst)
       {
           this.iconChildFirst = iconChildFirst;
       }
   
  -
       public String getIconChildMiddle()
       {
           return iconChildMiddle;
       }
   
  -
       public void setIconChildMiddle(String iconChildMiddle)
       {
           this.iconChildMiddle = iconChildMiddle;
       }
   
  -
       public String getIconChildLast()
       {
           return iconChildLast;
       }
   
  -
       public void setIconChildLast(String iconChildLast)
       {
           this.iconChildLast = iconChildLast;
       }
   
  -
       public String getIconNodeOpen()
       {
           return iconNodeOpen;
       }
   
  -
       public void setIconNodeOpen(String iconNodeOpen)
       {
           this.iconNodeOpen = iconNodeOpen;
       }
   
  -
       public String getIconNodeOpenFirst()
       {
           return iconNodeOpenFirst;
       }
   
  -
       public void setIconNodeOpenFirst(String iconNodeOpenFirst)
       {
           this.iconNodeOpenFirst = iconNodeOpenFirst;
       }
   
  -
       public String getIconNodeOpenMiddle()
       {
           return iconNodeOpenMiddle;
       }
   
  -
       public void setIconNodeOpenMiddle(String iconNodeOpenMiddle)
       {
           this.iconNodeOpenMiddle = iconNodeOpenMiddle;
       }
   
  -
       public String getIconNodeOpenLast()
       {
           return iconNodeOpenLast;
       }
   
  -
       public void setIconNodeOpenLast(String iconNodeOpenLast)
       {
           this.iconNodeOpenLast = iconNodeOpenLast;
       }
   
  -
       public String getIconNodeClose()
       {
           return iconNodeClose;
       }
   
  -
       public void setIconNodeClose(String iconNodeClose)
       {
           this.iconNodeClose = iconNodeClose;
       }
   
  -
       public String getIconNodeCloseFirst()
       {
           return iconNodeCloseFirst;
       }
   
  -
       public void setIconNodeCloseFirst(String iconNodeCloseFirst)
       {
           this.iconNodeCloseFirst = iconNodeCloseFirst;
       }
   
  -
       public String getIconNodeCloseMiddle()
       {
           return iconNodeCloseMiddle;
       }
   
  -
       public void setIconNodeCloseMiddle(String iconNodeCloseMiddle)
       {
           this.iconNodeCloseMiddle = iconNodeCloseMiddle;
       }
   
  -
       public String getIconNodeCloseLast()
       {
           return iconNodeCloseLast;
       }
   
  -
       public void setIconNodeCloseLast(String iconNodeCloseLast)
       {
           this.iconNodeCloseLast = iconNodeCloseLast;
       }
   
  -
       public String getStyleClass()
       {
           return styleClass;
       }
   
  -
       public void setStyleClass(String styleClass)
       {
           this.styleClass = styleClass;
       }
   
  -
       public String getNodeClass()
       {
           return nodeClass;
       }
   
  -
       public void setNodeClass(String nodeClass)
       {
           this.nodeClass = nodeClass;
       }
   
  -
       public String getSelectedNodeClass()
       {
           return selectedNodeClass;
       }
   
  -
       public void setSelectedNodeClass(String selectedNodeClass)
       {
           this.selectedNodeClass = selectedNodeClass;
       }
   
  -
       public String getIconClass()
       {
           return iconClass;
       }
   
  -
       public void setIconClass(String iconClass)
       {
           this.iconClass = iconClass;
       }
   
  +    /**
  +     * @return Returns the footerClass.
  +     */
  +    public String getFooterClass()
  +    {
  +        return footerClass;
  +    }
  +
  +    /**
  +     * @param footerClass The footerClass to set.
  +     */
  +    public void setFooterClass(String footerClass)
  +    {
  +        this.footerClass = footerClass;
  +    }
  +
  +    /**
  +     * @return Returns the headerClass.
  +     */
  +    public String getHeaderClass()
  +    {
  +        return headerClass;
  +    }
  +
  +    /**
  +     * @param headerClass The headerClass to set.
  +     */
  +    public void setHeaderClass(String headerClass)
  +    {
  +        this.headerClass = headerClass;
  +    }
   
       public boolean isExpandRoot()
       {
           return expandRoot;
       }
   
  -
       public void setExpandRoot(boolean expandRoot)
       {
           this.expandRoot = expandRoot;
       }
   
  -
       public long getExpireListeners()
       {
           return expireListeners;
       }
   
  -
       public void setExpireListeners(long expireListeners)
       {
           this.expireListeners = expireListeners;
       }
   
  -
       /**
        * Obtain tree model or create a default model.
        */
  @@ -356,7 +380,7 @@
           if (value != null)
           {
               ValueBinding valueBinding = context.getApplication().createValueBinding(value);
  -            TreeModel treeModel = (TreeModel)(valueBinding.getValue(context));
  +            TreeModel treeModel = (TreeModel) (valueBinding.getValue(context));
   
               if (treeModel == null)
               {
  @@ -373,8 +397,9 @@
               // component was created, so expand the root node
               TreeModel model = tree.getModel(context);
   
  -            if (model != null) {
  -                tree.expandPath(new TreePath(new Object[]{model.getRoot()}), context);
  +            if (model != null)
  +            {
  +                tree.expandPath(new TreePath(new Object[] { model.getRoot() }), context);
               }
           }
   
  @@ -382,7 +407,6 @@
           return answer;
       }
   
  -
       /**
        * Applies attributes to the tree component
        */
  @@ -409,6 +433,7 @@
               component.setValueBinding("model", binding);
           }
   
  +        setStringProperty(component, "var", var);
           setStringProperty(component, "iconLine", iconLine);
           setStringProperty(component, "iconNoline", iconNoline);
           setStringProperty(component, "iconChild", iconChild);
  @@ -424,9 +449,13 @@
           setStringProperty(component, "iconNodeCloseMiddle", iconNodeCloseMiddle);
           setStringProperty(component, "iconNodeCloseLast", iconNodeCloseLast);
           setStringProperty(component, "styleClass", styleClass);
  +        setStringProperty(component, "rowClasses", rowClasses);
  +        setStringProperty(component, "columnClasses", columnClasses);
  +        setStringProperty(component, "headerClass", headerClass);
  +        setStringProperty(component, "footerClass", footerClass);
           setStringProperty(component, "nodeClass", nodeClass);
           setStringProperty(component, "selectedNodeClass", selectedNodeClass);
           setStringProperty(component, "iconClass", iconClass);
  -        ((HtmlTree)component).setExpireListeners(expireListeners);
  +        ((HtmlTree) component).setExpireListeners(expireListeners);
       }
  -}
  +}
  \ No newline at end of file
  
  
  
  1.4       +72 -34    incubator-myfaces/src/components/org/apache/myfaces/custom/tree/DefaultMutableTreeNode.java
  
  Index: DefaultMutableTreeNode.java
  ===================================================================
  RCS file: /home/cvs/incubator-myfaces/src/components/org/apache/myfaces/custom/tree/DefaultMutableTreeNode.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DefaultMutableTreeNode.java	13 Oct 2004 11:50:58 -0000	1.3
  +++ DefaultMutableTreeNode.java	26 Nov 2004 12:14:10 -0000	1.4
  @@ -19,46 +19,52 @@
   import java.util.Collections;
   import java.util.Iterator;
   
  -
   /**
    * Default implementation of {@link MutableTreeNode}.
  - *
  - * @author <a href="mailto:oliver@rossmueller.com">Oliver Rossmueller</a>
  + * 
  + * @author <a href="mailto:oliver@rossmueller.com">Oliver Rossmueller </a>
    * @version $Revision$ $Date$
  - *          $Log$
  - *          Revision 1.3  2004/10/13 11:50:58  matze
  - *          renamed packages to org.apache
    *
  - *          Revision 1.2  2004/07/01 21:53:07  mwessendorf
  - *          ASF switch
  - *
  - *          Revision 1.1  2004/04/22 10:20:23  manolito
  - *          tree component
  + * $Log$
  + * Revision 1.4  2004/11/26 12:14:10  oros
  + * MYFACES-8: applied tree table patch by David Le Strat
    *
  + *  
    */
  -public class DefaultMutableTreeNode
  -        implements MutableTreeNode
  +public class DefaultMutableTreeNode implements MutableTreeNode
   {
   
       private ArrayList children = new ArrayList();
  +
       private Object userObject;
  +
       MutableTreeNode parent;
  -    private boolean allowsChildren = true;
   
  +    private boolean allowsChildren = true;
   
  +    /**
  +     * @param userObject The userObject.
  +     */
       public DefaultMutableTreeNode(Object userObject)
       {
           this.userObject = userObject;
       }
   
  -
  +    /**
  +     * @param children The children.
  +     * @param allowsChildren The allowsChildren.
  +     */
       public DefaultMutableTreeNode(ArrayList children, boolean allowsChildren)
       {
           this.children = children;
           this.allowsChildren = allowsChildren;
       }
   
  -
  +    /**
  +     * @param userObject The userobject.
  +     * @param parent The parent.
  +     * @param allowsChildren The allowsChildren.
  +     */
       public DefaultMutableTreeNode(Object userObject, MutableTreeNode parent, boolean allowsChildren)
       {
           this.userObject = userObject;
  @@ -66,28 +72,36 @@
           this.allowsChildren = allowsChildren;
       }
   
  -
  +    /**
  +     * @see org.apache.myfaces.custom.tree.MutableTreeNode#insert(org.apache.myfaces.custom.tree.MutableTreeNode)
  +     */
       public void insert(MutableTreeNode child)
       {
           children.add(child);
           child.setParent(this);
       }
   
  -
  +    /**
  +     * @see org.apache.myfaces.custom.tree.MutableTreeNode#insert(org.apache.myfaces.custom.tree.MutableTreeNode, int)
  +     */
       public void insert(MutableTreeNode child, int index)
       {
           children.add(index, child);
           child.setParent(this);
       }
   
  -
  +    /**
  +     * @see org.apache.myfaces.custom.tree.MutableTreeNode#remove(int)
  +     */
       public void remove(int index)
       {
  -        MutableTreeNode child = (MutableTreeNode)children.remove(index);
  +        MutableTreeNode child = (MutableTreeNode) children.remove(index);
           child.setParent(null);
       }
   
  -
  +    /**
  +     * @see org.apache.myfaces.custom.tree.MutableTreeNode#remove(org.apache.myfaces.custom.tree.MutableTreeNode)
  +     */
       public void remove(MutableTreeNode node)
       {
           if (children.remove(node))
  @@ -96,19 +110,25 @@
           }
       }
   
  -
  +    /**
  +     * @see org.apache.myfaces.custom.tree.MutableTreeNode#setUserObject(java.lang.Object)
  +     */
       public void setUserObject(Object object)
       {
           this.userObject = object;
       }
   
  -
  +    /**
  +     * @see org.apache.myfaces.custom.tree.TreeNode#getUserObject()
  +     */
       public Object getUserObject()
       {
           return userObject;
       }
   
  -
  +    /**
  +     * @see org.apache.myfaces.custom.tree.MutableTreeNode#removeFromParent()
  +     */
       public void removeFromParent()
       {
           if (parent == null)
  @@ -118,55 +138,73 @@
           parent.remove(this);
       }
   
  -
  +    /**
  +     * @see org.apache.myfaces.custom.tree.MutableTreeNode#setParent(org.apache.myfaces.custom.tree.MutableTreeNode)
  +     */
       public void setParent(MutableTreeNode parent)
       {
           this.parent = parent;
       }
   
  -
  +    /**
  +     * @see org.apache.myfaces.custom.tree.TreeNode#getChildAt(int)
  +     */
       public TreeNode getChildAt(int index)
       {
  -        return (TreeNode)children.get(index);
  +        return (TreeNode) children.get(index);
       }
   
  -
  +    /**
  +     * @see org.apache.myfaces.custom.tree.TreeNode#getChildCount()
  +     */
       public int getChildCount()
       {
           return children.size();
       }
   
  -
  +    /**
  +     * @see org.apache.myfaces.custom.tree.TreeNode#getParent()
  +     */
       public TreeNode getParent()
       {
           return parent;
       }
   
  -
  +    /**
  +     * @see org.apache.myfaces.custom.tree.TreeNode#getIndex(org.apache.myfaces.custom.tree.TreeNode)
  +     */
       public int getIndex(TreeNode node)
       {
           return children.indexOf(node);
       }
   
  -
  +    /**
  +     * @see org.apache.myfaces.custom.tree.TreeNode#getAllowsChildren()
  +     */
       public boolean getAllowsChildren()
       {
           return allowsChildren;
       }
   
  -
  +    /**
  +     * @see org.apache.myfaces.custom.tree.TreeNode#isLeaf()
  +     */
       public boolean isLeaf()
       {
           return children.isEmpty();
       }
   
  -
  +    /**
  +     * @see org.apache.myfaces.custom.tree.TreeNode#children()
  +     */
       public Iterator children()
       {
           return Collections.unmodifiableCollection(children).iterator();
       }
   
  -
  +    /**
  +     * @see java.lang.Object#toString()
  +     */
       public String toString()
       {
           if (userObject != null)
  @@ -175,4 +213,4 @@
           }
           return super.toString();
       }
  -}
  +}
  \ No newline at end of file
  
  
  
  1.25      +104 -92   incubator-myfaces/src/components/org/apache/myfaces/custom/tree/HtmlTree.java
  
  Index: HtmlTree.java
  ===================================================================
  RCS file: /home/cvs/incubator-myfaces/src/components/org/apache/myfaces/custom/tree/HtmlTree.java,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- HtmlTree.java	13 Oct 2004 11:50:58 -0000	1.24
  +++ HtmlTree.java	26 Nov 2004 12:14:10 -0000	1.25
  @@ -17,7 +17,9 @@
   
   import java.io.IOException;
   import java.util.*;
  +
   import javax.faces.component.UIViewRoot;
  +import javax.faces.component.html.HtmlPanelGroup;
   import javax.faces.context.FacesContext;
   import javax.faces.el.ValueBinding;
   
  @@ -27,114 +29,49 @@
   import org.apache.myfaces.custom.tree.model.TreeModelEvent;
   import org.apache.myfaces.custom.tree.model.TreeModelListener;
   import org.apache.myfaces.custom.tree.model.TreePath;
  -import org.apache.myfaces.component.html.ext.HtmlPanelGroup;
   
   
   /**
  - * <p>Tree implementation based on javax.swing.JTree.</p>
  - * <p>The tree model is assigned by using a value binding named <code>model</code> and is not
  - * stored in view state.</p>
  - * <p>A hierarchy of {@link HtmlTreeNode} objects is used to represent the current
  - * expanded state of the tree. The root node is held as a faces named <code>rootNode</code>.</p>
  + * <p/>
  + * Tree implementation based on javax.swing.JTree.
  + * </p>
  + * <p/>
  + * The tree model is assigned by using a value binding named <code>model</code>
  + * and is not stored in view state.
  + * </p>
  + * <p/>
  + * A hierarchy of {@link HtmlTreeNode}objects is used to represent the current
  + * expanded state of the tree. The root node is held as a faces named
  + * <code>rootNode</code>.
  + * </p>
    *
  - * @author <a href="mailto:oliver@rossmueller.com">Oliver Rossmueller</a>
  + * @author <a href="mailto:oliver@rossmueller.com">Oliver Rossmueller </a>
    * @version $Revision$ $Date$
  + *          <p/>
    *          $Log$
  - *          Revision 1.24  2004/10/13 11:50:58  matze
  - *          renamed packages to org.apache
  - *
  - *          Revision 1.23  2004/10/10 21:39:16  o_rossmueller
  - *          expandAll/collapseAll (contributed by Hamidreza Sattari <hh...@yahoo.com>)
  + *          Revision 1.25  2004/11/26 12:14:10  oros
  + *          MYFACES-8: applied tree table patch by David Le Strat
    *
  - *          Revision 1.22  2004/10/10 11:21:18  o_rossmueller
  - *          expandAll/collapseAll (contributed by Hamidreza Sattari <hh...@yahoo.com>)
  - *          <p/>
  - *          Revision 1.21  2004/09/01 18:32:54  mwessendorf
  - *          Organize Imports
  - *          <p/>
  - *          Revision 1.20  2004/08/15 15:28:04  o_rossmueller
  - *          new model listener handling to get modified from events which occur outside the scope of a tree request
  - *          <p/>
  - *          Revision 1.19  2004/07/26 22:55:10  o_rossmueller
  - *          use ids instead of clientIds
  - *          <p/>
  - *          Revision 1.18  2004/07/25 11:08:02  o_rossmueller
  - *          use HtmlTree class name for PREVIOUS_VIEW_ROOT constant
  - *          <p/>
  - *          Revision 1.17  2004/07/25 11:06:38  o_rossmueller
  - *          made default image paths relative (again)
  - *          <p/>
  - *          Revision 1.16  2004/07/18 21:39:34  o_rossmueller
  - *          fix #992452: child icon attributes are restored correctly
  - *          <p/>
  - *          Revision 1.15  2004/07/18 21:36:27  o_rossmueller
  - *          fix #991740: getResourceURL for tree image urls
  - *          <p/>
  - *          Revision 1.14  2004/07/11 23:38:57  o_rossmueller
  - *          support multiple trees in one view
  - *          <p/>
  - *          Revision 1.13  2004/07/01 21:53:07  mwessendorf
  - *          ASF switch
  - *          <p/>
  - *          Revision 1.12  2004/05/12 02:27:43  o_rossmueller
  - *          fix #951896: tree component works for JAVASCRIPT=false, too
  - *          <p/>
  - *          Revision 1.11  2004/05/10 01:24:51  o_rossmueller
  - *          added iconClass attribute
  - *          <p/>
  - *          Revision 1.10  2004/05/05 00:18:57  o_rossmueller
  - *          various fixes/modifications in model event handling and tree update
  - *          <p/>
  - *          Revision 1.9  2004/05/04 12:19:14  o_rossmueller
  - *          added icon provider
  - *          <p/>
  - *          Revision 1.8  2004/05/04 00:28:17  o_rossmueller
  - *          model event handling
  - *          <p/>
  - *          Revision 1.7  2004/04/29 18:48:16  o_rossmueller
  - *          node selection handling
  - *          <p/>
  - *          Revision 1.6  2004/04/23 19:09:34  o_rossmueller
  - *          state transition magic
  - *          <p/>
  - *          Revision 1.5  2004/04/22 23:22:33  o_rossmueller
  - *          fix: queueEvent
  - *          <p/>
  - *          Revision 1.4  2004/04/22 22:00:30  o_rossmueller
  - *          implemented HtmlTree.expandPath
  - *          <p/>
  - *          Revision 1.3  2004/04/22 21:14:55  o_rossmueller
  - *          TreeSelectionListener support
  - *          <p/>
  - *          Revision 1.2  2004/04/22 13:00:09  o_rossmueller
  - *          changed id creation - node ids are now generated by tree
  - *          <p/>
  - *          Revision 1.1  2004/04/22 10:20:23  manolito
  - *          tree component
    */
  -public class HtmlTree
  -    extends HtmlPanelGroup
  -    implements TreeModelListener
  +public class HtmlTree extends HtmlPanelGroup implements TreeModelListener
   {
   
       public static final int DEFAULT_EXPIRE_LISTENERS = 8 * 60 * 60 * 1000; // 8 hours
  -
  -
       private static final String FACET_ROOTNODE = "rootNode";
       private static final String PREVIOUS_VIEW_ROOT = HtmlTree.class.getName() + ".PREVIOUS_VIEW_ROOT";
  -
       private static final int EVENT_CHANGED = 0;
       private static final int EVENT_INSERTED = 1;
       private static final int EVENT_REMOVED = 2;
       private static final int EVENT_STRUCTURE_CHANGED = 3;
  -
       private static int counter = 0;
   
  -
       private IconProvider iconProvider;
       private boolean itemStatesRestored = false;
  +    private String var;
       private String styleClass;
       private String nodeClass;
  +    private String rowClasses;
  +    private String columnClasses;
       private String selectedNodeClass;
       private String iconClass;
       private String iconLine = "images/tree/line.gif";
  @@ -157,6 +94,11 @@
       private long expireListeners = DEFAULT_EXPIRE_LISTENERS;
   
   
  +    /**
  +     * <p/>
  +     * Default constructor.
  +     * </p>
  +     */
       public HtmlTree()
       {
           internalId = counter++;
  @@ -203,6 +145,24 @@
       }
   
   
  +    /**
  +     * @return Returns the var.
  +     */
  +    public String getVar()
  +    {
  +        return var;
  +    }
  +
  +
  +    /**
  +     * @param var The var to set.
  +     */
  +    public void setVar(String var)
  +    {
  +        this.var = var;
  +    }
  +
  +
       public String getIconLine()
       {
           return iconLine;
  @@ -395,12 +355,54 @@
       }
   
   
  +    /**
  +     * @return Returns the rowClasses.
  +     */
  +    public String getRowClasses()
  +    {
  +        return rowClasses;
  +    }
  +
  +
  +    /**
  +     * @param rowClasses The rowClasses to set.
  +     */
  +    public void setRowClasses(String rowClasses)
  +    {
  +        this.rowClasses = rowClasses;
  +    }
  +
  +
  +    /**
  +     * @return Returns the columnClasses.
  +     */
  +    public String getColumnClasses()
  +    {
  +        return columnClasses;
  +    }
  +
  +
  +    /**
  +     * @param columnClasses The columnClasses to set.
  +     */
  +    public void setColumnClasses(String columnClasses)
  +    {
  +        this.columnClasses = columnClasses;
  +    }
  +
  +
  +    /**
  +     * @return Returns the selectedNodeClass.
  +     */
       public String getSelectedNodeClass()
       {
           return selectedNodeClass;
       }
   
   
  +    /**
  +     * @param selectedNodeClass The selectedNodeClass to set.
  +     */
       public void setSelectedNodeClass(String selectedNodeClass)
       {
           this.selectedNodeClass = selectedNodeClass;
  @@ -438,9 +440,9 @@
   
   
       /**
  -     * Ensures that the node identified by the specified path is
  -     * expanded and viewable. If the last item in the path is a
  -     * leaf, this will have no effect.
  +     * Ensures that the node identified by the specified path is expanded and
  +     * viewable. If the last item in the path is a leaf, this will have no
  +     * effect.
        *
        * @param path the <code>TreePath</code> identifying a node
        */
  @@ -469,8 +471,8 @@
   
   
       /**
  -     * Ensures that the node identified by the specified path is
  -     * collapsed and viewable.
  +     * Ensures that the node identified by the specified path is collapsed and
  +     * viewable.
        *
        * @param path the <code>TreePath</code> identifying a node
        */
  @@ -567,7 +569,7 @@
   
       public Object saveState(FacesContext context)
       {
  -        Object values[] = new Object[22];
  +        Object values[] = new Object[25];
           values[0] = super.saveState(context);
           values[1] = iconChild;
           values[2] = iconChildFirst;
  @@ -590,6 +592,9 @@
           values[19] = iconClass;
           values[20] = new Integer(internalId);
           values[21] = new Long(expireListeners);
  +        values[22] = rowClasses;
  +        values[23] = columnClasses;
  +        values[24] = var;
           return ((Object) (values));
       }
   
  @@ -619,6 +624,9 @@
           iconClass = (String) values[19];
           internalId = ((Integer) values[20]).intValue();
           expireListeners = ((Long) values[21]).longValue();
  +        rowClasses = (String) values[22];
  +        columnClasses = (String) values[23];
  +        var = (String) values[24];
           addToModelListeners();
       }
   
  @@ -629,7 +637,8 @@
   
           //Save the current view root for later reference...
           context.getExternalContext().getRequestMap().put(PREVIOUS_VIEW_ROOT, context.getViewRoot());
  -        //...and remember that this instance needs NO special treatment on rendering:
  +        //...and remember that this instance needs NO special treatment on
  +        // rendering:
           itemStatesRestored = true;
       }
   
  @@ -892,7 +901,9 @@
       {
   
           private long lastAccessTime = System.currentTimeMillis();
  +
           private LinkedList events = new LinkedList();
  +
           int id;
   
   
  @@ -950,6 +961,7 @@
       {
   
           private int kind;
  +
           private TreeModelEvent event;
   
   
  @@ -979,4 +991,4 @@
               }
           }
       }
  -}
  +}
  \ No newline at end of file
  
  
  
  1.11      +2 -27     incubator-myfaces/src/components/org/apache/myfaces/custom/tree/HtmlTreeNode.java
  
  Index: HtmlTreeNode.java
  ===================================================================
  RCS file: /home/cvs/incubator-myfaces/src/components/org/apache/myfaces/custom/tree/HtmlTreeNode.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- HtmlTreeNode.java	13 Oct 2004 11:50:58 -0000	1.10
  +++ HtmlTreeNode.java	26 Nov 2004 12:14:10 -0000	1.11
  @@ -30,36 +30,11 @@
    *
    * @author <a href="mailto:oliver@rossmueller.com">Oliver Rossmueller</a>
    * @version $Revision$ $Date$
  - *          $Log$
  - *          Revision 1.10  2004/10/13 11:50:58  matze
  - *          renamed packages to org.apache
  - *
  - *          Revision 1.9  2004/10/10 11:17:18  o_rossmueller
  - *          move selection up in tree when a node is removed
    *
  - *          Revision 1.8  2004/07/01 21:53:07  mwessendorf
  - *          ASF switch
  - *
  - *          Revision 1.7  2004/05/05 00:18:57  o_rossmueller
  - *          various fixes/modifications in model event handling and tree update
  + *          $Log$
  + *          Revision 1.11  2004/11/26 12:14:10  oros
  + *          MYFACES-8: applied tree table patch by David Le Strat
    *
  - *          Revision 1.6  2004/05/04 00:28:17  o_rossmueller
  - *          model event handling
  - *          <p/>
  - *          Revision 1.5  2004/04/23 19:09:35  o_rossmueller
  - *          state transition magic
  - *          <p/>
  - *          Revision 1.4  2004/04/22 22:00:31  o_rossmueller
  - *          implemented HtmlTree.expandPath
  - *          <p/>
  - *          Revision 1.3  2004/04/22 21:14:56  o_rossmueller
  - *          TreeSelectionListener support
  - *          <p/>
  - *          Revision 1.2  2004/04/22 13:00:10  o_rossmueller
  - *          changed id creation - node ids are now generated by tree
  - *          <p/>
  - *          Revision 1.1  2004/04/22 10:20:23  manolito
  - *          tree component
    */
   public class HtmlTreeNode
       extends HtmlCommandLink
  
  
  
  1.4       +28 -0     incubator-myfaces/src/components/org/apache/myfaces/custom/tree/Tree.xml
  
  Index: Tree.xml
  ===================================================================
  RCS file: /home/cvs/incubator-myfaces/src/components/org/apache/myfaces/custom/tree/Tree.xml,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Tree.xml	29 Oct 2004 15:51:05 -0000	1.3
  +++ Tree.xml	26 Nov 2004 12:14:10 -0000	1.4
  @@ -1,4 +1,20 @@
   <?xml version="1.0" encoding="ISO-8859-1" ?>
  +<!--
  +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.
  +-->
  +
   <!DOCTYPE component PUBLIC
     "-//MyFaces//DTD MyFaces component def 1.0//EN"
     "http://myfaces.apache.org/dtd/Component.dtd">
  @@ -13,6 +29,10 @@
           <type>java.lang.String</type>
       </field>
       <field>
  +        <name>var</name>
  +        <type>java.lang.String</type>
  +    </field>
  +    <field>
           <name>styleClass</name>
           <type>java.lang.String</type>
       </field>
  @@ -22,6 +42,14 @@
       </field>
       <field>
           <name>selectedNodeClass</name>
  +        <type>java.lang.String</type>
  +    </field>
  +    <field>
  +        <name>rowClasses</name>
  +        <type>java.lang.String</type>
  +    </field>
  +    <field>
  +        <name>columnClasses</name>
           <type>java.lang.String</type>
       </field>
       <field>
  
  
  
  1.4       +12 -17    incubator-myfaces/src/components/org/apache/myfaces/custom/tree/TreeNode.java
  
  Index: TreeNode.java
  ===================================================================
  RCS file: /home/cvs/incubator-myfaces/src/components/org/apache/myfaces/custom/tree/TreeNode.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TreeNode.java	13 Oct 2004 11:50:58 -0000	1.3
  +++ TreeNode.java	26 Nov 2004 12:14:10 -0000	1.4
  @@ -18,64 +18,59 @@
   import java.util.Iterator;
   
   /**
  - * Defines the requirements for an object that can be used as a tree node for {@link HtmlTree}.
  - * (inspired by javax.swing.tree.TreeNode).
  - *
  - * @author <a href="mailto:oliver@rossmueller.com">Oliver Rossmueller</a>
  + * Defines the requirements for an object that can be used as a tree node for
  + * {@link HtmlTree}. (inspired by javax.swing.tree.TreeNode).
  + * 
  + * @author <a href="mailto:oliver@rossmueller.com">Oliver Rossmueller </a>
    * @version $Revision$ $Date$
  - *          $Log$
  - *          Revision 1.3  2004/10/13 11:50:58  matze
  - *          renamed packages to org.apache
    *
  - *          Revision 1.2  2004/07/01 21:53:07  mwessendorf
  - *          ASF switch
  - *
  - *          Revision 1.1  2004/04/22 10:20:23  manolito
  - *          tree component
  + *          $Log$
  + *          Revision 1.4  2004/11/26 12:14:10  oros
  + *          MYFACES-8: applied tree table patch by David Le Strat
    *
  + *  *  
    */
   public interface TreeNode
   {
   
       /**
  +     * @return Gets the user object of this node.
  +     */
  +    Object getUserObject();
  +
  +    /**
        * Answer the child at the given index.
        */
       TreeNode getChildAt(int childIndex);
   
  -
       /**
        * Answer the number of children this node contains.
        */
       int getChildCount();
   
  -
       /**
        * Answer the parent of this node.
        */
       TreeNode getParent();
   
  -
       /**
        * Answer the index of the given node in this node's children.
        */
       int getIndex(TreeNode node);
   
  -
       /**
        * Answer true if this node allows children.
        */
       boolean getAllowsChildren();
   
  -
       /**
        * Answer true if this is a leaf node.
        */
       boolean isLeaf();
   
  -
       /**
        * Answer the children of the receiver. The base collection is unmodifyable.
        */
       Iterator children();
   
  -}
  +}
  \ No newline at end of file
  
  
  
  1.1                  incubator-myfaces/src/components/org/apache/myfaces/custom/tree/HtmlTreeColumn.java
  
  Index: HtmlTreeColumn.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;
  
  import javax.faces.component.UIColumn;
  
  /**
   * <p>
   * Tree column model. This column is used to provide the place holder for the
   * tree.  This is used in conjunction with the table format display.
   * </p>
   * @author <a href="mailto:dlestrat@apache.org">David Le Strat</a>
   */
  public class HtmlTreeColumn extends UIColumn
  {
      /** The component type. */
      public static final String COMPONENT_TYPE = "org.apache.myfaces.HtmlTreeColumn";
      
      /** The component family. */
      public static final String COMPONENT_FAMILY = "org.apache.myfaces.HtmlTreeColumn";
      
      /**
       * <p>
       * Default Constructor.
       * </p>
       */
      public HtmlTreeColumn()
      {
          super();
      }
      
      /**
       * @see javax.faces.component.UIComponent#getFamily()
       */
      public String getFamily()
      {
          return COMPONENT_FAMILY;
      }
  }
  
  
  
  1.1                  incubator-myfaces/src/components/org/apache/myfaces/custom/tree/HtmlTreeColumn.xml
  
  Index: HtmlTreeColumn.xml
  ===================================================================
  <?xml version="1.0"?>
  <!--
  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.
  -->
  <component>
      <component-class>org.apache.myfaces.custom.tree.HtmlTreeColumn</component-class>
      <base-class>javax.faces.component.UIComponentBase</base-class>
      <component-type>org.apache.myfaces.HtmlTreeColumn</component-type>
      <component-family>org.apache.myfaces.HtmlTreeColumn</component-family>
      <field proprietary="true" generateProperty="false" saveState="false">
          <name>footer</name>
          <type>javax.faces.component.UIComponent</type>
      </field>
      <field proprietary="true" generateProperty="false" saveState="false">
          <name>header</name>
          <type>javax.faces.component.UIComponent</type>
      </field>
  </component>
  
  
  
  1.5       +108 -179  incubator-myfaces/src/share/org/apache/myfaces/renderkit/html/HtmlTableRendererBase.java
  
  Index: HtmlTableRendererBase.java
  ===================================================================
  RCS file: /home/cvs/incubator-myfaces/src/share/org/apache/myfaces/renderkit/html/HtmlTableRendererBase.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- HtmlTableRendererBase.java	13 Oct 2004 11:51:01 -0000	1.4
  +++ HtmlTableRendererBase.java	26 Nov 2004 12:14:10 -0000	1.5
  @@ -36,41 +36,23 @@
   /**
    * @author Thomas Spiegl (latest modification by $Author$)
    * @version $Revision$ $Date$
  - * $Log$
  - * Revision 1.4  2004/10/13 11:51:01  matze
  - * renamed packages to org.apache
    *
  - * Revision 1.3  2004/09/03 14:31:52  manolito
  - * render header and footer style class with th/rd instead of tr
    *
  - * Revision 1.2  2004/09/02 13:38:02  manolito
  - * protected methods for easier overwriting of header and footer rendering
  + *          $Log$
  + *          Revision 1.5  2004/11/26 12:14:10  oros
  + *          MYFACES-8: applied tree table patch by David Le Strat
    *
  - * Revision 1.1  2004/08/20 07:14:43  manolito
  - * HtmlDataTable now also supports rowIndexVar and rowCountVar
  - *
  - *
  - *
  - * old cvs log (HtmlTableRenderer in myfaces impl):
  - *
  - * Revision 1.20  2004/08/09 08:01:08  manolito
  - * bug #1004896 - id attribute not rendered
  - *
  - * Revision 1.19  2004/07/01 22:05:06  mwessendorf
  - * ASF switch
  - *
  - * Revision 1.18  2004/06/22 15:26:04  prophecyslides
  - * headerClass does not apply to the <tr> in spec, so removed it.
  - *
  - * Revision 1.17  2004/06/21 23:12:46  prophecyslides
  - * headerClass style propogates to the <th> elements, not just the <tr>
  - *
  - * Revision 1.16  2004/06/21 10:57:59  manolito
  - * missing CVS Log keyword
  + * 
    */
  -public class HtmlTableRendererBase
  -    extends HtmlRenderer
  +public class HtmlTableRendererBase extends HtmlRenderer
   {
  +    /** Header facet name. */
  +    protected static final String HEADER_FACET_NAME = "header";
  +
  +    /** Footer facet name. */
  +    protected static final String FOOTER_FACET_NAME = "footer";
  +
  +    /** The logger. */
       private static final Log log = LogFactory.getLog(HtmlTableRendererBase.class);
   
       public boolean getRendersChildren()
  @@ -84,21 +66,21 @@
   
           ResponseWriter writer = facesContext.getResponseWriter();
   
  -        beforeTable(facesContext, (UIData)uiComponent);
  +        beforeTable(facesContext, (UIData) uiComponent);
   
           HtmlRendererUtils.writePrettyLineSeparator(facesContext);
           writer.startElement(HTML.TABLE_ELEM, uiComponent);
           writer.writeAttribute(HTML.ID_ATTR, uiComponent.getClientId(facesContext), null);
           HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.TABLE_PASSTHROUGH_ATTRIBUTES);
   
  -        renderFacet(facesContext, writer, (UIData)uiComponent, true);
  +        renderFacet(facesContext, writer, (UIData) uiComponent, true);
       }
   
       public void encodeChildren(FacesContext facesContext, UIComponent component) throws IOException
       {
           RendererUtils.checkParamValidity(facesContext, component, UIData.class);
   
  -        UIData uiData = (UIData)component;
  +        UIData uiData = (UIData) component;
   
           ResponseWriter writer = facesContext.getResponseWriter();
   
  @@ -109,13 +91,13 @@
           String columnClasses;
           if (component instanceof HtmlDataTable)
           {
  -            rowClasses = ((HtmlDataTable)component).getRowClasses();
  -            columnClasses = ((HtmlDataTable)component).getColumnClasses();
  +            rowClasses = ((HtmlDataTable) component).getRowClasses();
  +            columnClasses = ((HtmlDataTable) component).getColumnClasses();
           }
           else
           {
  -            rowClasses = (String)component.getAttributes().get(JSFAttr.ROW_CLASSES_ATTR);
  -            columnClasses = (String)component.getAttributes().get(JSFAttr.COLUMN_CLASSES_ATTR);
  +            rowClasses = (String) component.getAttributes().get(JSFAttr.ROW_CLASSES_ATTR);
  +            columnClasses = (String) component.getAttributes().get(JSFAttr.COLUMN_CLASSES_ATTR);
           }
           Styles styles = new Styles(rowClasses, columnClasses);
   
  @@ -127,7 +109,8 @@
               rows = rowCount - first;
           }
           int last = first + rows;
  -        if (last > rowCount) last = rowCount;
  +        if (last > rowCount)
  +            last = rowCount;
   
           for (int i = first; i < last; i++)
           {
  @@ -151,8 +134,8 @@
               List children = component.getChildren();
               for (int j = 0, size = component.getChildCount(); j < size; j++)
               {
  -                UIComponent child = (UIComponent)children.get(j);
  -                if (child instanceof UIColumn && ((UIColumn)child).isRendered())
  +                UIComponent child = (UIComponent) children.get(j);
  +                if (child instanceof UIColumn && ((UIColumn) child).isRendered())
                   {
                       writer.startElement(HTML.TD_ELEM, component);
                       if (styles.hasColumnStyle())
  @@ -171,7 +154,6 @@
           writer.endElement(HTML.TBODY_ELEM);
       }
   
  -
       /**
        * Convenient method for derived table renderers.
        */
  @@ -205,129 +187,93 @@
           RendererUtils.checkParamValidity(facesContext, uiComponent, UIData.class);
   
           ResponseWriter writer = facesContext.getResponseWriter();
  -        renderFacet(facesContext, writer, (UIData)uiComponent, false);
  +        renderFacet(facesContext, writer, (UIData) uiComponent, false);
           writer.endElement(HTML.TABLE_ELEM);
           HtmlRendererUtils.writePrettyLineSeparator(facesContext);
   
  -        afterTable(facesContext, (UIData)uiComponent);
  +        afterTable(facesContext, (UIData) uiComponent);
       }
   
  -    
  -    private void renderFacet(FacesContext facesContext,
  -                             ResponseWriter writer,
  -                             UIData uiData,
  -                             boolean header) throws IOException
  +    protected void renderFacet(FacesContext facesContext, ResponseWriter writer, UIComponent component, boolean header)
  +            throws IOException
       {
           int colspan = 0;
           boolean hasColumnFacet = false;
  -        for (Iterator it = uiData.getChildren().iterator(); it.hasNext(); )
  +        for (Iterator it = component.getChildren().iterator(); it.hasNext();)
           {
  -            UIComponent uiComponent = (UIComponent)it.next();
  -            if (uiComponent instanceof UIColumn &&
  -                ((UIColumn)uiComponent).isRendered())
  +            UIComponent uiComponent = (UIComponent) it.next();
  +            if (uiComponent instanceof UIColumn && ((UIColumn) uiComponent).isRendered())
               {
                   colspan++;
                   if (!hasColumnFacet)
                   {
  -                    hasColumnFacet = header ? ((UIColumn)uiComponent).getHeader() != null :
  -                        ((UIColumn)uiComponent).getFooter() != null;
  +                    hasColumnFacet = header ? ((UIColumn) uiComponent).getHeader() != null : ((UIColumn) uiComponent)
  +                            .getFooter() != null;
                   }
               }
           }
   
  -        UIComponent facet = header ? uiData.getHeader() : uiData.getFooter();
  +        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, uiData);
  +            writer.startElement(elemName, component);
               if (header)
               {
  -                String headerStyleClass = getHeaderClass(uiData);
  -                if (facet != null) renderTableHeaderRow(facesContext, writer, uiData, facet, headerStyleClass, colspan);
  -                if (hasColumnFacet) renderColumnHeaderRow(facesContext, writer, uiData, headerStyleClass);
  +                String headerStyleClass = getHeaderClass(component);
  +                if (facet != null)
  +                    renderTableHeaderRow(facesContext, writer, component, facet, headerStyleClass, colspan);
  +                if (hasColumnFacet)
  +                    renderColumnHeaderRow(facesContext, writer, component, headerStyleClass);
               }
               else
               {
  -                String footerStyleClass = getFooterClass(uiData);
  -                if (hasColumnFacet) renderColumnFooterRow(facesContext, writer, uiData, footerStyleClass);
  -                if (facet != null) renderTableFooterRow(facesContext, writer, uiData, facet, footerStyleClass, colspan);
  +                String footerStyleClass = getFooterClass(component);
  +                if (hasColumnFacet)
  +                    renderColumnFooterRow(facesContext, writer, component, footerStyleClass);
  +                if (facet != null)
  +                    renderTableFooterRow(facesContext, writer, component, facet, footerStyleClass, colspan);
               }
               writer.endElement(elemName);
           }
       }
   
  -        
  -    protected void renderTableHeaderRow(FacesContext facesContext,
  -                                        ResponseWriter writer,
  -                                        UIData uiData,
  -                                        UIComponent headerFacet,
  -                                        String headerStyleClass,
  -                                        int colspan)
  -        throws IOException
  -    {
  -        renderTableHeaderOrFooterRow(facesContext,
  -                                     writer,
  -                                     uiData,
  -                                     headerFacet,
  -                                     headerStyleClass,
  -                                     HTML.TH_ELEM,
  -                                     colspan);
  -    }
  -        
  -    protected void renderTableFooterRow(FacesContext facesContext,
  -                                        ResponseWriter writer,
  -                                        UIData uiData,
  -                                        UIComponent footerFacet,
  -                                        String footerStyleClass,
  -                                        int colspan)
  -        throws IOException
  -    {
  -        renderTableHeaderOrFooterRow(facesContext,
  -                         writer,
  -                         uiData,
  -                         footerFacet,
  -                         footerStyleClass,
  -                         HTML.TD_ELEM,
  -                         colspan);
  -    }
  -
  -
  -    protected void renderColumnHeaderRow(FacesContext facesContext,
  -                                      ResponseWriter writer,
  -                                      UIData uiData,
  -                                      String headerStyleClass)
  -        throws IOException
  -    {
  -        renderColumnHeaderOrFooterRow(facesContext, writer, uiData, headerStyleClass, true);
  -    }
  -
  -    protected void renderColumnFooterRow(FacesContext facesContext,
  -                                      ResponseWriter writer,
  -                                      UIData uiData,
  -                                      String footerStyleClass)
  -        throws IOException
  -    {
  -        renderColumnHeaderOrFooterRow(facesContext, writer, uiData, footerStyleClass, false);
  +    protected void renderTableHeaderRow(FacesContext facesContext, ResponseWriter writer, UIComponent component,
  +            UIComponent headerFacet, String headerStyleClass, int colspan) throws IOException
  +    {
  +        renderTableHeaderOrFooterRow(facesContext, writer, component, headerFacet, headerStyleClass, HTML.TH_ELEM,
  +                colspan);
       }
   
  +    protected void renderTableFooterRow(FacesContext facesContext, ResponseWriter writer, UIComponent component,
  +            UIComponent footerFacet, String footerStyleClass, int colspan) throws IOException
  +    {
  +        renderTableHeaderOrFooterRow(facesContext, writer, component, footerFacet, footerStyleClass, HTML.TD_ELEM,
  +                colspan);
  +    }
   
  +    protected void renderColumnHeaderRow(FacesContext facesContext, ResponseWriter writer, UIComponent component,
  +            String headerStyleClass) throws IOException
  +    {
  +        renderColumnHeaderOrFooterRow(facesContext, writer, component, headerStyleClass, true);
  +    }
   
  +    protected void renderColumnFooterRow(FacesContext facesContext, ResponseWriter writer, UIComponent component,
  +            String footerStyleClass) throws IOException
  +    {
  +        renderColumnHeaderOrFooterRow(facesContext, writer, component, footerStyleClass, false);
  +    }
   
  -    private void renderTableHeaderOrFooterRow(FacesContext facesContext,
  -                                              ResponseWriter writer,
  -                                              UIData uiData,
  -                                              UIComponent facet,
  -                                              String styleClass,
  -                                              String colElementName,
  -                                              int colspan)
  -        throws IOException
  +    private void renderTableHeaderOrFooterRow(FacesContext facesContext, ResponseWriter writer, UIComponent component,
  +            UIComponent facet, String styleClass, String colElementName, int colspan) throws IOException
       {
           HtmlRendererUtils.writePrettyLineSeparator(facesContext);
  -        writer.startElement(HTML.TR_ELEM, uiData);
  -        writer.startElement(colElementName, uiData);
  +        writer.startElement(HTML.TR_ELEM, component);
  +        writer.startElement(colElementName, component);
           if (colElementName.equals(HTML.TH_ELEM))
           {
               writer.writeAttribute(HTML.SCOPE_ATTR, HTML.SCOPE_COLGROUP_VALUE, null);
  @@ -345,53 +291,40 @@
           writer.endElement(HTML.TR_ELEM);
       }
   
  -
  -
  -    private void renderColumnHeaderOrFooterRow(FacesContext facesContext,
  -                                               ResponseWriter writer,
  -                                               UIData uiData,
  -                                               String styleClass,
  -                                               boolean header)
  -        throws IOException
  +    private void renderColumnHeaderOrFooterRow(FacesContext facesContext, ResponseWriter writer, UIComponent component,
  +            String styleClass, boolean header) throws IOException
       {
           HtmlRendererUtils.writePrettyLineSeparator(facesContext);
  -        writer.startElement(HTML.TR_ELEM, uiData);
  -        for (Iterator it = uiData.getChildren().iterator(); it.hasNext(); )
  +        writer.startElement(HTML.TR_ELEM, component);
  +        for (Iterator it = component.getChildren().iterator(); it.hasNext();)
           {
  -            UIComponent uiComponent = (UIComponent)it.next();
  -            if (uiComponent instanceof UIColumn &&
  -                ((UIColumn)uiComponent).isRendered())
  +            UIComponent uiComponent = (UIComponent) it.next();
  +            if (uiComponent instanceof UIColumn && ((UIColumn) uiComponent).isRendered())
               {
                   if (header)
                   {
  -                    renderColumnHeaderCell(facesContext,
  -                                           writer,
  -                                           (UIColumn)uiComponent,
  -                                           styleClass);
  +                    renderColumnHeaderCell(facesContext, writer, (UIColumn) uiComponent, styleClass, 0);
                   }
                   else
                   {
  -                    renderColumnFooterCell(facesContext,
  -                                           writer,
  -                                           (UIColumn)uiComponent,
  -                                           styleClass);
  +                    renderColumnFooterCell(facesContext, writer, (UIColumn) uiComponent, styleClass, 0);
                   }
               }
           }
           writer.endElement(HTML.TR_ELEM);
       }
   
  -
  -    protected void renderColumnHeaderCell(FacesContext facesContext,
  -                                          ResponseWriter writer,
  -                                          UIColumn uiColumn,
  -                                          String headerStyleClass)
  -        throws IOException
  +    protected void renderColumnHeaderCell(FacesContext facesContext, ResponseWriter writer, UIColumn uiColumn,
  +            String headerStyleClass, int colspan) throws IOException
       {
           writer.startElement(HTML.TH_ELEM, uiColumn);
  +        if (colspan > 1)
  +        {
  +            writer.writeAttribute(HTML.COLSPAN_ATTR, new Integer(colspan), null);
  +        }
           if (headerStyleClass != null)
           {
  -             writer.writeAttribute(HTML.CLASS_ATTR, headerStyleClass, null);
  +            writer.writeAttribute(HTML.CLASS_ATTR, headerStyleClass, null);
           }
           UIComponent facet = uiColumn.getHeader();
           if (facet != null)
  @@ -401,16 +334,17 @@
           writer.endElement(HTML.TH_ELEM);
       }
   
  -    protected void renderColumnFooterCell(FacesContext facesContext,
  -                                          ResponseWriter writer,
  -                                          UIColumn uiColumn,
  -                                          String footerStyleClass)
  -        throws IOException
  +    protected void renderColumnFooterCell(FacesContext facesContext, ResponseWriter writer, UIColumn uiColumn,
  +            String footerStyleClass, int colspan) throws IOException
       {
           writer.startElement(HTML.TD_ELEM, uiColumn);
  +        if (colspan > 1)
  +        {
  +            writer.writeAttribute(HTML.COLSPAN_ATTR, new Integer(colspan), null);
  +        }
           if (footerStyleClass != null)
           {
  -             writer.writeAttribute(HTML.CLASS_ATTR, footerStyleClass, null);
  +            writer.writeAttribute(HTML.CLASS_ATTR, footerStyleClass, null);
           }
           UIComponent facet = uiColumn.getFooter();
           if (facet != null)
  @@ -420,54 +354,50 @@
           writer.endElement(HTML.TD_ELEM);
       }
   
  -
  -    private static String getHeaderClass(UIData component)
  +    protected static String getHeaderClass(UIComponent component)
       {
           if (component instanceof HtmlDataTable)
           {
  -            return ((HtmlDataTable)component).getHeaderClass();
  +            return ((HtmlDataTable) component).getHeaderClass();
           }
           else
           {
  -            return (String)component.getAttributes().get(JSFAttr.HEADER_CLASS_ATTR);
  +            return (String) component.getAttributes().get(JSFAttr.HEADER_CLASS_ATTR);
           }
       }
   
  -    private static String getFooterClass(UIData component)
  +    protected static String getFooterClass(UIComponent component)
       {
           if (component instanceof HtmlDataTable)
           {
  -            return ((HtmlDataTable)component).getFooterClass();
  +            return ((HtmlDataTable) component).getFooterClass();
           }
           else
           {
  -            return (String)component.getAttributes().get(JSFAttr.FOOTER_CLASS_ATTR);
  +            return (String) component.getAttributes().get(JSFAttr.FOOTER_CLASS_ATTR);
           }
       }
   
  -
       //-------------------------------------------------------------
       // Helper class Styles
       //-------------------------------------------------------------
       private static class Styles
       {
  -        //~ Instance fields ------------------------------------------------------------------------
  +        //~ Instance fields
  +        // ------------------------------------------------------------------------
   
           private String[] _columnStyle;
  -        private String[] _rowStyle;
   
  -        //~ Constructors ---------------------------------------------------------------------------
  +        private String[] _rowStyle;
   
  +        //~ Constructors
  +        // ---------------------------------------------------------------------------
           Styles(String rowStyles, String columnStyles)
           {
  -            _rowStyle = (rowStyles == null)
  -                ? ArrayUtils.EMPTY_STRING_ARRAY
  -                : StringUtils.trim(
  -                    StringUtils.splitShortString(rowStyles, ','));
  -            _columnStyle = (columnStyles == null)
  -                ? ArrayUtils.EMPTY_STRING_ARRAY
  -                : StringUtils.trim(
  -                    StringUtils.splitShortString(columnStyles, ','));
  +            _rowStyle = (rowStyles == null) ? ArrayUtils.EMPTY_STRING_ARRAY : StringUtils.trim(StringUtils
  +                    .splitShortString(rowStyles, ','));
  +            _columnStyle = (columnStyles == null) ? ArrayUtils.EMPTY_STRING_ARRAY : StringUtils.trim(StringUtils
  +                    .splitShortString(columnStyles, ','));
           }
   
           public String getRowStyle(int idx)
  @@ -500,5 +430,4 @@
   
       }
   
  -
  -}
  +}
  \ No newline at end of file
  
  
  
  1.129     +34 -1     incubator-myfaces/tlds/myfaces_ext.tld
  
  Index: myfaces_ext.tld
  ===================================================================
  RCS file: /home/cvs/incubator-myfaces/tlds/myfaces_ext.tld,v
  retrieving revision 1.128
  retrieving revision 1.129
  diff -u -r1.128 -r1.129
  --- myfaces_ext.tld	23 Nov 2004 23:24:04 -0000	1.128
  +++ myfaces_ext.tld	26 Nov 2004 12:14:10 -0000	1.129
  @@ -1235,6 +1235,11 @@
               <rtexprvalue>false</rtexprvalue>
           </attribute>
           <attribute>
  +            <name>var</name>
  +            <required>false</required>
  +            <rtexprvalue>false</rtexprvalue>
  +        </attribute>
  +        <attribute>
               <name>styleClass</name>
               <required>false</required>
               <rtexprvalue>false</rtexprvalue>
  @@ -1250,6 +1255,26 @@
               <rtexprvalue>false</rtexprvalue>
           </attribute>
           <attribute>
  +            <name>headerClass</name>
  +            <required>false</required>
  +            <rtexprvalue>false</rtexprvalue>
  +        </attribute>
  +        <attribute>
  +            <name>footerClass</name>
  +            <required>false</required>
  +            <rtexprvalue>false</rtexprvalue>
  +        </attribute>
  +        <attribute>
  +            <name>rowClasses</name>
  +            <required>false</required>
  +            <rtexprvalue>false</rtexprvalue>
  +        </attribute>
  +        <attribute>
  +            <name>columnClasses</name>
  +            <required>false</required>
  +            <rtexprvalue>false</rtexprvalue>
  +        </attribute>
  +        <attribute>
               <name>iconClass</name>
               <required>false</required>
               <rtexprvalue>false</rtexprvalue>
  @@ -1358,7 +1383,15 @@
               <rtexprvalue>false</rtexprvalue>
           </attribute>
       </tag>
  -
  +    
  +    <!-- column -->
  +    <tag>
  +        <name>treecolumn</name>
  +        <tag-class>org.apache.myfaces.custom.tree.taglib.TreeColumnTag</tag-class>
  +        <body-content>JSP</body-content>
  +        &ui_component_attributes;
  +    </tag>
  +     
       <!-- panelStack -->
       <tag>
           <name>panelStack</name>
  
  
  
  1.8       +1 -0      incubator-myfaces/webapps/examples/src/org/apache/myfaces/examples/resource/example_messages.properties
  
  Index: example_messages.properties
  ===================================================================
  RCS file: /home/cvs/incubator-myfaces/webapps/examples/src/org/apache/myfaces/examples/resource/example_messages.properties,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- example_messages.properties	25 Nov 2004 15:30:05 -0000	1.7
  +++ example_messages.properties	26 Nov 2004 12:14:10 -0000	1.8
  @@ -23,6 +23,7 @@
   nav_Popup           = Popup
   nav_dataList        = Dynamic Lists
   nav_tree            = Tree
  +nav_treeTable       = Tree Table
   nav_Validate		= Validations
   nav_rssTicker		= RssTicker
   nav_dataScroller    = DataScroller
  
  
  
  1.35      +13 -0     incubator-myfaces/webapps/examples/web/WEB-INF/examples-config.xml
  
  Index: examples-config.xml
  ===================================================================
  RCS file: /home/cvs/incubator-myfaces/webapps/examples/web/WEB-INF/examples-config.xml,v
  retrieving revision 1.34
  retrieving revision 1.35
  diff -u -r1.34 -r1.35
  --- examples-config.xml	22 Nov 2004 09:18:54 -0000	1.34
  +++ examples-config.xml	26 Nov 2004 12:14:10 -0000	1.35
  @@ -73,6 +73,14 @@
           <managed-bean-class>org.apache.myfaces.examples.listexample.SimpleCountryList</managed-bean-class>
           <managed-bean-scope>session</managed-bean-scope>
       </managed-bean>
  +    
  +    <!-- Managed Beans for tree.jsp -->
  +
  +    <managed-bean>
  +        <managed-bean-name>treeTable</managed-bean-name>
  +        <managed-bean-class>org.apache.myfaces.examples.listexample.TreeTable</managed-bean-class>
  +        <managed-bean-scope>session</managed-bean-scope>
  +    </managed-bean>
   
   
       <!-- Managed Beans for simpleSortList.jsp -->
  @@ -266,6 +274,11 @@
           <navigation-case>
               <from-outcome>go_tree</from-outcome>
               <to-view-id>/tree.jsp</to-view-id>
  +        </navigation-case>
  +        
  +        <navigation-case>
  +            <from-outcome>go_treeTable</from-outcome>
  +            <to-view-id>/treeTable.jsp</to-view-id>
           </navigation-case>
   
           <navigation-case>
  
  
  
  1.26      +59 -2     incubator-myfaces/webapps/examples/web/css/basic.css
  
  Index: basic.css
  ===================================================================
  RCS file: /home/cvs/incubator-myfaces/webapps/examples/web/css/basic.css,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- basic.css	17 Nov 2004 11:25:43 -0000	1.25
  +++ basic.css	26 Nov 2004 12:14:10 -0000	1.26
  @@ -352,13 +352,70 @@
       border-style: none;
   }
   
  +/*
  +   ------------------------------------------------------------
  +   Tree component
  +   ------------------------------------------------------------
  +*/
  +
  +body, th, td, input, select {
  +	font-family: Verdana, Helvetica, Arial, sans-serif;
  +}
  +
  +table, th, td {
  +	font-size: small;
  +	border: none;
  +}
  +
  +.treeHeader {
  +	background-color: #bbb;
  +	border: 0.75px solid #fff;
  +	padding: 2px 3px;
  +	text-align: left;
  +}
  +
  +.treeFooter {
  +	padding: 5px;
  +	margin: .67em 2px;
  +	margin-top: 0;
  +	background-color: #ddd;
  +	background-image: url(../images/sw_med_rond.gif);
  +	background-repeat: no-repeat;
  +	background-position: bottom left;
  +}
  +
  +input, .treeFooter {
  +	font-size: xx-small;
  +	font-size: x-small;
  +}
  +
  +.a td {
  +	background: #ddd;
  +	border-bottom: 1px solid #fff;
  +}
  +
  +.b td {
  +	background: #efefef;
  +	border-bottom: 1px solid #fff;
  +}
  +
  +.col1 {
  +	border-right: 1px solid #fff;
  +	padding: 2px 15px 2px 5px;
  +}
  +
  +.col2 {
  +	border-left: 1px solid #fff;
  +	padding: 2px 15px 2px 5px;
  +}
  +
   .tree {
      lineheight: 18px;
      font-family: arial, sans-serif;
   }
   
   .treenode {
  -   padding: 2px 2px 2px 5px;
  +   padding: 2px 15px 2px 5px;
   }
   
   .treenode a {
  @@ -366,7 +423,7 @@
   }
   
   .treenodeSelected {
  -   padding: 2px 2px 2px 5px;
  +   padding: 2px 15px 2px 5px;
   }
   
   .treenodeSelected a {
  
  
  
  1.39      +3 -2      incubator-myfaces/webapps/examples/web/inc/page_header.jsp
  
  Index: page_header.jsp
  ===================================================================
  RCS file: /home/cvs/incubator-myfaces/webapps/examples/web/inc/page_header.jsp,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -u -r1.38 -r1.39
  --- page_header.jsp	17 Nov 2004 11:25:43 -0000	1.38
  +++ page_header.jsp	26 Nov 2004 12:14:10 -0000	1.39
  @@ -35,8 +35,9 @@
                   <x:navigationMenuItem id="nav_2_4_6_1" itemLabel="#{example_messages['nav_Popup']}" action="go_popup" icon="images/myfaces.gif" split="true" />
                   <x:navigationMenuItem id="nav_2_4_7" itemLabel="#{example_messages['nav_dataList']}" action="go_dataList" icon="images/myfaces.gif" />
                   <x:navigationMenuItem id="nav_2_4_8" itemLabel="#{example_messages['nav_tree']}" action="go_tree" icon="images/myfaces.gif" />
  -                <x:navigationMenuItem id="nav_2_4_9" itemLabel="#{example_messages['nav_rssTicker']}" action="go_rssticker" icon="images/myfaces.gif" />
  -                <x:navigationMenuItem id="nav_2_4_10" itemLabel="#{example_messages['nav_dataScroller']}" action="go_datascroller" icon="images/myfaces.gif" />
  +                <x:navigationMenuItem id="nav_2_4_9" itemLabel="#{example_messages['nav_treeTable']}" action="go_treeTable" icon="images/myfaces.gif" />
  +                <x:navigationMenuItem id="nav_2_4_10" itemLabel="#{example_messages['nav_rssTicker']}" action="go_rssticker" icon="images/myfaces.gif" />
  +                <x:navigationMenuItem id="nav_2_4_11" itemLabel="#{example_messages['nav_dataScroller']}" action="go_datascroller" icon="images/myfaces.gif" />
                   <x:navigationMenuItem id="nav_2_4_12" itemLabel="#{example_messages['nav_panelstack']}" action="go_panelstack" icon="images/myfaces.gif" />
               </x:navigationMenuItem>
           </x:navigationMenuItem>
  
  
  
  1.1                  incubator-myfaces/webapps/examples/web/treeTable.jsp
  
  Index: treeTable.jsp
  ===================================================================
  <%@ page session="true" contentType="text/html;charset=utf-8"%>
  <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
  <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
  <%@ taglib uri="http://myfaces.apache.org/extensions" prefix="x"%>
  <html>
  
  <!--
  /*
   * 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.
   */
  //-->
  
  <%@include file="inc/head.inc" %>
  
  <body>
  <head>
  <link rel="stylesheet" type="text/css" href="css/basic.css">
  </head>
  
  <f:view>
  
      <f:loadBundle basename="org.apache.myfaces.examples.resource.example_messages" var="example_messages"/>
  
      <x:panelLayout id="page" layout="#{globalOptions.pageLayout}"
              styleClass="pageLayout"
              headerClass="pageHeader"
              navigationClass="pageNavigation"
              bodyClass="pageBody"
              footerClass="pageFooter" >
  
          <f:facet name="header">
              <f:subview id="header">
                  <jsp:include page="inc/page_header.jsp" />
              </f:subview>
          </f:facet>
  
          <f:facet name="navigation">
              <f:subview id="menu" >
                  <jsp:include page="inc/navigation.jsp" />
              </f:subview>
          </f:facet>
  
          <f:facet name="body">
              <h:panelGroup id="body">
  
      <h:form>
          <x:tree id="tree" value="#{treeTable.treeModel}"
          		var="treeItem"
          		styleClass="tree"
          	    nodeClass="treenode"
          	    headerClass="treeHeader"
          	    footerClass="treeFooter"
      	        rowClasses="a, b"
      	        columnClasses="col1, col2"
  	            selectedNodeClass="treenodeSelected"
  	            expandRoot="true">
  	        <h:column>
  	        	<f:facet name="header">
                  	<h:outputText value="Header 1" />
                  </f:facet>
                 	<h:outputText value="#{treeItem.isoCode}" />
              </h:column>
  	        <x:treecolumn>
  	        	<f:facet name="header">
                  	<h:outputText value="Header 2" />
                  </f:facet>
  	        	<h:outputText value="#{treeItem.name}" />
  	        </x:treecolumn>
  	        <h:column>
  	        	<f:facet name="header">
                  	<h:outputText value="Header 3" />
                  </f:facet>
          		<h:outputText value="#{treeItem.description}" />
              </h:column>
              <f:facet name="footer">
              	<h:outputText value="Footer" />
              </f:facet>
       	</x:tree>
  		<f:verbatim><br></f:verbatim>
  
     </h:form>
  
     </h:panelGroup>
          </f:facet>
  
          <%@include file="inc/page_footer.jsp" %>
  
      </x:panelLayout>
  
  </f:view>
  
  </body>
  
  </html>
  
  
  1.2       +1 -0      incubator-myfaces/webapps/tiles/web/WEB-INF/.cvsignore
  
  Index: .cvsignore
  ===================================================================
  RCS file: /home/cvs/incubator-myfaces/webapps/tiles/web/WEB-INF/.cvsignore,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- .cvsignore	6 Sep 2004 08:41:52 -0000	1.1
  +++ .cvsignore	26 Nov 2004 12:14:11 -0000	1.2
  @@ -1 +1,2 @@
   web.xml
  +classes