Author: dolander
Date: Sat Jan 29 14:04:50 2005
New Revision: 149075

URL: http://svn.apache.org/viewcvs?view=rev&rev=149075
Log:
This is a "mostly" working version of the expandOnClient feature in the Tree.
I've tested in both IE and Firefox.  There is one remaining issue, I'm not
cascading the inheritable state correctly from the tree.

Created a ServletTreeRenderer which is called in the XmlHttpRequest to render 
the
new nodes that are the children of the node being expanded.

Added a TreeRenderState property to the ITreeRootElement so the 
ServletTreeRender
can get the state that was set on the Tree tag.



Added:
   
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/ServletTreeRenderer.java
Modified:
   incubator/beehive/trunk/netui/src/javascript/tagshtml/netui-tree.js
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/requeststate/ServletInterceptorContext.java
   
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/StringBuilderRenderAppender.java
   
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/ITreeRootElement.java
   
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TagTreeRenderer.java
   
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/Tree.java
   
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeCRI.java
   
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeElement.java
   
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeRenderer.java
   
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeRootElement.java

Modified: incubator/beehive/trunk/netui/src/javascript/tagshtml/netui-tree.js
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/javascript/tagshtml/netui-tree.js?view=diff&rev=149075&p1=incubator/beehive/trunk/netui/src/javascript/tagshtml/netui-tree.js&r1=149074&p2=incubator/beehive/trunk/netui/src/javascript/tagshtml/netui-tree.js&r2=149075
==============================================================================
--- incubator/beehive/trunk/netui/src/javascript/tagshtml/netui-tree.js 
(original)
+++ incubator/beehive/trunk/netui/src/javascript/tagshtml/netui-tree.js Sat Jan 
29 14:04:50 2005
@@ -125,13 +125,68 @@
     }
 }
 
+function getCData(node)
+{
+    for (var i=0;i<node.childNodes.length;i++) {
+       if (node.childNodes[i].nodeType == 4)
+           return node.childNodes[i];
+    }
+    return null;
+}
+
 // If the XmlHttpRequest results in a valid XML document, this will be called
 function NetUITreeXmlHttpRequestReturn(req)
 {
-   var x = req.responseXML.getElementsByTagName("node");
-   if (x == null || x.length == 0)
+   var nodeName = req.responseXML.getElementsByTagName("node");
+   if (nodeName == null || nodeName.length == 0)
        return;
-   alert(x[0].childNodes[0].nodeValue);
+
+   var treeDivs = req.responseXML.getElementsByTagName("treeDiv");
+
+
+   nodeName = nodeName[0].childNodes[0].nodeValue;
+
+   for (var i=0;i<document.links.length;i++) {
+       var attr = document.links[i].getAttribute("netui-tree-id");
+       if (attr != null) {
+          if (attr == nodeName) {
+              var dump = "DUMP:\n";
+              var treeNode = document.links[i];
+              treeNode.removeAttribute("netui:expandOnServer");
+              treeNode = treeNode.parentNode;
+              for (var j=0;j<treeDivs.length;j++) {
+                  var txt = getCData(treeDivs[j]);
+                   //alert("Text:" + txt.nodeValue);
+                  if (txt == null) {
+                      reportError("Didn't find the CDATA");
+                      return;
+                  }
+              
+                  var pElement = document.createElement("div");
+                  if (treeNode.nextSibling != null) {
+                      var sib = treeNode.nextSibling;
+                      pElement.innerHTML=txt.nodeValue;
+                      var newNode = pElement.childNodes[0];
+                      treeNode.parentNode.insertBefore(newNode,sib);
+                      treeNode = newNode;
+                      //alert(dumpNodes(dump,pElement,0));
+                  }
+              }
+          }
+       }
+   }
+}
+
+function dumpNodes(results, node, level)
+{
+    for (var i=0;i<level;i++) {
+       results = results + " ";
+    }
+    results = results + node + "\n";
+  
+    for (var i=0;i<node.childNodes.length;i++)
+        results = dumpNodes(results,node.childNodes[i],level+1);
+    return results
 }
 
 function NetUIExpandTree()

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/requeststate/ServletInterceptorContext.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/requeststate/ServletInterceptorContext.java?view=diff&rev=149075&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/requeststate/ServletInterceptorContext.java&r1=149074&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/requeststate/ServletInterceptorContext.java&r2=149075
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/requeststate/ServletInterceptorContext.java
    (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/requeststate/ServletInterceptorContext.java
    Sat Jan 29 14:04:50 2005
@@ -45,7 +45,7 @@
         return _response;
     }
 
-    public ServletContext getServletConteext() {
+    public ServletContext getServletContext() {
         return _context;
     }
 }

Modified: 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/StringBuilderRenderAppender.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/StringBuilderRenderAppender.java?view=diff&rev=149075&p1=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/StringBuilderRenderAppender.java&r1=149074&p2=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/StringBuilderRenderAppender.java&r2=149075
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/StringBuilderRenderAppender.java
        (original)
+++ 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/rendering/StringBuilderRenderAppender.java
        Sat Jan 29 14:04:50 2005
@@ -51,4 +51,8 @@
         assert _sb != null : "Render appender doesn't have a valid string 
builder";
         _sb.append(c);
     }
+
+    public String toString() {
+        return _sb.toString();
+    }
 }

Modified: 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/ITreeRootElement.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/ITreeRootElement.java?view=diff&rev=149075&p1=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/ITreeRootElement.java&r1=149074&p2=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/ITreeRootElement.java&r2=149075
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/ITreeRootElement.java
        (original)
+++ 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/ITreeRootElement.java
        Sat Jan 29 14:04:50 2005
@@ -32,4 +32,16 @@
      * @param selectNode
      */
     void changeSelected(String selectNode);
+
+    /**
+     * return the TreeRenderState for this tree.
+     * @return
+     */
+    TreeRenderState getTreeRenderState();
+
+    /**
+     * Set the TreeRenderState
+     * @param trs
+     */
+    void setTreeRenderState(TreeRenderState trs);
 }

Added: 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/ServletTreeRenderer.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/ServletTreeRenderer.java?view=auto&rev=149075
==============================================================================
--- (empty file)
+++ 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/ServletTreeRenderer.java
     Sat Jan 29 14:04:50 2005
@@ -0,0 +1,66 @@
+/*
+ * 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.
+ *
+ * $Header:$
+ */
+package org.apache.beehive.netui.tags.tree;
+
+import org.apache.beehive.netui.tags.rendering.AbstractHtmlState;
+import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.ServletContext;
+import javax.servlet.jsp.JspException;
+
+public class ServletTreeRenderer extends TreeRenderer
+{
+    AbstractRenderAppender _writer;
+    StringBuilder _sb;
+
+    ServletTreeRenderer(TreeRenderState trs,InheritableState 
iState,HttpServletRequest request,
+                 HttpServletResponse response, ServletContext servletContext,
+                 AbstractRenderAppender writer, StringBuilder sb)
+    {
+        super(trs,iState,request,response,servletContext);
+        _writer = writer;
+        _sb = sb;
+    }
+
+    protected void renderBeforeNode(AbstractRenderAppender writer,TreeElement 
node)
+    {
+        writer.append("<![CDATA[");
+    }
+
+    protected void renderAfterNode(AbstractRenderAppender writer,TreeElement 
node)
+    {
+        writer.append("]]>");
+        TreeCRI.writeElement(_writer, "treeDiv",writer.toString().trim());
+        _sb.setLength(0);
+    }
+
+    protected void registerTagError(String message, Throwable e)
+        throws JspException
+    {
+        // @todo: add logging here
+        System.err.println("Error in rendering tree:" + message);
+    }
+
+    protected String renderTagId(HttpServletRequest request, String tagId, 
AbstractHtmlState state)
+    {
+        // @todo: this needs to be implemented
+        return null;
+    }
+}

Modified: 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TagTreeRenderer.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TagTreeRenderer.java?view=diff&rev=149075&p1=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TagTreeRenderer.java&r1=149074&p2=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TagTreeRenderer.java&r2=149075
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TagTreeRenderer.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TagTreeRenderer.java
 Sat Jan 29 14:04:50 2005
@@ -4,15 +4,17 @@
 
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import javax.servlet.jsp.JspException;
 
 class TagTreeRenderer extends TreeRenderer
 {
     private Tree _tree;
 
-    TagTreeRenderer(Tree tree,TreeRenderState trs,InheritableState 
iState,HttpServletRequest request,ServletContext servletContext)
+    TagTreeRenderer(Tree tree,TreeRenderState trs,InheritableState 
iState,HttpServletRequest request,
+                 HttpServletResponse response, ServletContext servletContext)
     {
-        super(trs,iState,request,servletContext);
+        super(trs,iState,request,response,servletContext);
         _tree = tree;
     }
 

Modified: 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/Tree.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/Tree.java?view=diff&rev=149075&p1=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/Tree.java&r1=149074&p2=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/Tree.java&r2=149075
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/Tree.java
    (original)
+++ 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/Tree.java
    Sat Jan 29 14:04:50 2005
@@ -666,6 +666,9 @@
                 return;
             }
             srs.writeFeature(sr, writer, CoreScriptFeature.TREE_INIT, true, 
false, null);
+            assert(treeRoot instanceof ITreeRootElement);
+            ITreeRootElement tre = (ITreeRootElement) treeRoot;
+            tre.setTreeRenderState(_trs);
         }
 
         // create a containing tree level <div> and place the tree level 
styles on it.
@@ -682,6 +685,7 @@
         if (_trs.runAtClient) {
             _divState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
"netui:treeName",
                     ((INameable) treeRoot).getObjectname());
+
         }
         TagRenderingBase divRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.DIV_TAG, request);
         divRenderer.doStartTag(writer, _divState);
@@ -689,8 +693,8 @@
 
         // Render the tree.
         AttributeRenderer extraAttrs = new AttributeRenderer();
-        TagTreeRenderer ttr = new 
TagTreeRenderer(this,_trs,_iState,request,pageContext.getServletContext());
-        ttr.render(sb, request, response, treeRoot, 0, extraAttrs, _iState);
+        TagTreeRenderer ttr = new 
TagTreeRenderer(this,_trs,_iState,request,response,pageContext.getServletContext());
+        ttr.render(sb, treeRoot, 0, extraAttrs, _iState);
         if (hasErrors()) {
             reportErrors();
             return;

Modified: 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeCRI.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeCRI.java?view=diff&rev=149075&p1=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeCRI.java&r1=149074&p2=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeCRI.java&r2=149075
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeCRI.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeCRI.java
 Sat Jan 29 14:04:50 2005
@@ -18,13 +18,15 @@
 package org.apache.beehive.netui.tags.tree;
 
 import org.apache.beehive.netui.pageflow.requeststate.*;
-import org.apache.beehive.netui.tags.rendering.StringBuilderRenderAppender;
 import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender;
+import org.apache.beehive.netui.tags.rendering.StringBuilderRenderAppender;
+import org.apache.beehive.netui.tags.TagConfig;
 
+import javax.servlet.ServletContext;
+import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import javax.servlet.ServletResponse;
-import javax.servlet.jsp.JspWriter;
+import javax.servlet.jsp.JspException;
 import java.io.IOException;
 import java.io.Writer;
 
@@ -43,6 +45,7 @@
 
         HttpServletRequest request = (HttpServletRequest) 
((ServletInterceptorContext) ctxt).getRequest();
         ServletResponse response = ((ServletInterceptorContext) 
ctxt).getResponse();
+        ServletContext servletContext = ((ServletInterceptorContext) 
ctxt).getServletContext();
 
         // Create the command by striping off the context path and the 
extension
         String cmd = request.getRequestURI();
@@ -62,21 +65,22 @@
 
         // check to see if we handle this command
         if (TREE_COLLAPSE.equals(cmd)) {
-            handleExpandCollapse(false, request, response);
+            handleExpandCollapse(false, request, response, servletContext);
         }
         else if (TREE_EXPAND.equals(cmd)) {
-            handleExpandCollapse(true, request, response);
+            handleExpandCollapse(true, request, response, servletContext);
         }
         return;
     }
 
-    private void handleExpandCollapse(boolean expand, HttpServletRequest req, 
ServletResponse response)
+    private void handleExpandCollapse(boolean expand, HttpServletRequest req, 
ServletResponse response,
+                                      ServletContext ctxt)
     {
         String tree = req.getParameter("tree");
         String node = req.getParameter("node");
         String expandSvr = req.getParameter("expandOnServer");
-        System.err.println("TreeCommand:" + ((expand) ? "expand" : "collapse") 
+
-                " Tree:" + tree + " Node:" + node + " expandSvr:" + expandSvr);
+        //System.err.println("TreeCommand:" + ((expand) ? "expand" : 
"collapse") +
+        //        " Tree:" + tree + " Node:" + node + " expandSvr:" + 
expandSvr);
 
         NameService ns = NameService.instance(req.getSession());
         assert(ns != null);
@@ -84,16 +88,18 @@
         // get the tree from the name service
         INameable n = ns.get(tree);
         if (n == null) {
+            // @todo: need to log there errors
             System.err.println("Tree '" + tree + "' was not found in the 
NameService");
             return;
         }
-        if (!(n instanceof TreeElement)) {
-            System.err.println("Named Tree was not an instance of a tree");
+        if (!(n instanceof ITreeRootElement)) {
+            // @todo: need to log there errors
+            System.err.println("Named Tree was not an instance of a 
ITreeRootElement");
             return;
         }
 
-        TreeElement root = (TreeElement) n;
-        TreeElement elem = root.findNode(node);
+        ITreeRootElement root = (ITreeRootElement) n;
+        TreeElement elem = ((TreeElement) root).findNode(node);
         if (elem == null) {
             System.err.println("Element '" + node + "' not found in the tree");
             return;
@@ -110,15 +116,38 @@
             // add a tree identifier
             writeElement(writer, "node",node);
 
+            InheritableState iState = new InheritableState();
+            iState.initalizeTreeState();
+            iState.setImageRoot(req.getContextPath() + "/" +
+                    TagConfig.getTreeImageLocation());
+
+            try {
+                TreeElement children[] = elem.getChildren();
+                AttributeRenderer extraAttrs = new AttributeRenderer();
+                int newLevel = elem.getLevel() + 1;
+                StringBuilder treeRendering = new StringBuilder();
+                ServletTreeRenderer str = new 
ServletTreeRenderer(root.getTreeRenderState(),iState,req,
+                    (HttpServletResponse) response,ctxt,writer,treeRendering);
+                for (int i = 0; i < children.length; i++) {
+                    treeRendering.setLength(0);
+                    str.render(treeRendering, children[i], newLevel, 
extraAttrs, iState);
+                }
+            }
+            catch (JspException se) {
+                // @todo: need to log this
+                se.printStackTrace();
+                return;
+            }
+
+
             // add the tree text
-            writeElement(writer, "treeDiv","<![CDATA[<p>This is here</p>]]>");
-            
+
             writeEndElement(writer,TREE_EXPAND_ELEM);
             write(response,sb.toString());
         }
     }
 
-    private void writeStartElement(AbstractRenderAppender writer,String 
elementName)
+    public static void writeStartElement(AbstractRenderAppender writer,String 
elementName)
     {
         writer.append("<");
         writer.append(elementName);
@@ -126,14 +155,14 @@
 
     }
 
-    private void writeEndElement(AbstractRenderAppender writer,String 
elementName)
+    public static  void writeEndElement(AbstractRenderAppender writer,String 
elementName)
     {
         writer.append("</");
         writer.append(elementName);
         writer.append(">");
     }
 
-    private void writeElement(AbstractRenderAppender writer, String 
elementName, String value)
+    public static  void writeElement(AbstractRenderAppender writer, String 
elementName, String value)
     {
         writeStartElement(writer,elementName);
         writer.append(value);

Modified: 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeElement.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeElement.java?view=diff&rev=149075&p1=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeElement.java&r1=149074&p2=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeElement.java&r2=149075
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeElement.java
     (original)
+++ 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeElement.java
     Sat Jan 29 14:04:50 2005
@@ -271,8 +271,9 @@
      */
     public void setExpanded(boolean expanded)
     {
-        if (expanded)
+        if (expanded) {
             _boolState = _boolState | EXPANDED;
+        }
         else
             _boolState = _boolState & (-1 ^ EXPANDED);
     }
@@ -372,6 +373,17 @@
         int last = _parent.size() - 1;
         assert(last >= 0);
         return (_parent.getChild(last) == this);
+    }
+
+    public int getLevel()
+    {
+        TreeElement t = getParent();
+        int level = 0;
+        while (t != null) {
+            t = t.getParent();
+            level++;
+        }
+        return level;
     }
 
     /**

Modified: 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeRenderer.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeRenderer.java?view=diff&rev=149075&p1=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeRenderer.java&r1=149074&p2=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeRenderer.java&r2=149075
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeRenderer.java
    (original)
+++ 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeRenderer.java
    Sat Jan 29 14:04:50 2005
@@ -53,8 +53,11 @@
     private SpanTag.State _spanState = new SpanTag.State();
 
     private ServletContext _servletContext;
+    private HttpServletRequest _req;
+    private HttpServletResponse _res;
 
-    TreeRenderer(TreeRenderState trs, InheritableState iState, 
HttpServletRequest request,ServletContext servletContext)
+    TreeRenderer(TreeRenderState trs, InheritableState iState, 
HttpServletRequest request,
+                 HttpServletResponse response, ServletContext servletContext)
     {
         _trs = trs;
         _iState = iState;
@@ -63,6 +66,8 @@
         _divRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.DIV_TAG, request);
         _spanRenderer = 
TagRenderingBase.Factory.getRendering(TagRenderingBase.SPAN_TAG, request);
         _servletContext = servletContext;
+        _req = request;
+        _res = response;
     }
 
     abstract protected void registerTagError(String message, Throwable e)
@@ -70,28 +75,32 @@
 
     abstract protected String renderTagId(HttpServletRequest request, String 
tagId, AbstractHtmlState state);
 
+    protected void renderBeforeNode(AbstractRenderAppender writer,TreeElement 
node)
+    {
+    }
+
+    protected void renderAfterNode(AbstractRenderAppender writer,TreeElement 
node)
+    {
+    }
+
     /**
      * This is a recursive method which generates the markup for the tree.
      * @param sb
-     * @param request
-     * @param response
      * @param node
      * @param level
      * @param attrs
      * @param state
      * @throws javax.servlet.jsp.JspException
      */
-    protected void render(StringBuilder sb, HttpServletRequest request, 
HttpServletResponse response,
-                          TreeElement node, int level, AttributeRenderer 
attrs, InheritableState state)
+    protected void render(StringBuilder sb, TreeElement node, int level, 
AttributeRenderer attrs,
+                          InheritableState state)
             throws JspException
     {
         // assert the values...
         assert(sb != null);
-        assert(request != null);
-        assert(response != null);
         assert(node != null);
 
-        String encoding = response.getCharacterEncoding();
+        String encoding = _res.getCharacterEncoding();
         String nodeName = node.getName();
 
         assert(nodeName != null);
@@ -124,7 +133,7 @@
         String tagId = node.getTagId();
         String script = null;
         if (tagId != null) {
-            script = renderTagId(request, tagId, _divState);
+            script = renderTagId(_req, tagId, _divState);
         }
         attrs.renderDiv(_divState, node);
         if (_trs.runAtClient) {
@@ -132,6 +141,7 @@
         }
         sb.append("   ");
         StringBuilderRenderAppender writer = new 
StringBuilderRenderAppender(sb);
+        renderBeforeNode(writer,node);
         _divRenderer.doStartTag(writer, _divState);
         sb.append("\n");
         if (script != null)
@@ -139,7 +149,7 @@
 
         // In devMode we will verify the structure of the tree.  This will not 
run in
         // production mode.
-        ServletContext servletContext = 
InternalUtils.getServletContext(request);
+        ServletContext servletContext = InternalUtils.getServletContext(_req);
         boolean devMode = 
!AdapterManager.getServletContainerAdapter(servletContext).isInProductionMode();
         if (devMode) {
             boolean error = false;
@@ -199,7 +209,7 @@
         // boolean flag that will indicate if there is an open anchor created
         boolean closeAnchor = false;
         if (!_trs.runAtClient)
-            closeAnchor = renderExpansionAnchor(sb, _anchorRenderer, request, 
response, node, nodeName);
+            closeAnchor = renderExpansionAnchor(sb, _anchorRenderer, node, 
nodeName);
         else {
             // Render client expansion and initialize the tree JavaScript 
support
             closeAnchor = renderClientExpansionAnchor(sb, _anchorRenderer, 
node, encodedNodeName);
@@ -280,7 +290,7 @@
 
                 String uri = null;
                 try {
-                    uri = 
PageFlowUtils.getRewrittenActionURI(_servletContext,request,response,action,params,null,false);
+                    uri = 
PageFlowUtils.getRewrittenActionURI(_servletContext,_req,_res,action,params,null,false);
                     //uri = PageFlowTagUtils.rewriteActionURL(pageContext, 
action, params, null);
                 }
                 catch (URISyntaxException e) {
@@ -291,7 +301,7 @@
                 }
 
                 if (uri != null) {
-                    selectionLink = response.encodeURL(uri);
+                    selectionLink = _res.encodeURL(uri);
                 }
             }
         }
@@ -400,6 +410,7 @@
         sb.append("\n   ");
         _divRenderer.doEndTag(writer);
         sb.append("\n");
+        renderAfterNode(writer,node);
 
         // now remove all of the attributes scoped with this...
 
@@ -411,14 +422,13 @@
             TreeElement children[] = node.getChildren();
             int newLevel = level + 1;
             for (int i = 0; i < children.length; i++) {
-                render(sb, request, response, children[i], newLevel, attrs, 
state);
+                render(sb, children[i], newLevel, attrs, state);
             }
         }
         attrs.removeElement(node, removes);
     }
 
     private boolean renderExpansionAnchor(StringBuilder sb, TagRenderingBase 
anchorRenderer,
-                                          HttpServletRequest request, 
HttpServletResponse response,
                                           TreeElement node, String nodeName)
             throws JspException
     {
@@ -427,7 +437,7 @@
         if (action == null) {
             action = _iState.getSelectionAction();
         }
-        boolean isAction = PageFlowTagUtils.isAction(request, action);
+        boolean isAction = PageFlowTagUtils.isAction(_req, action);
         if (!isAction) {
             registerTagError(Bundle.getString("Tags_BadAction", action), null);
             return false;
@@ -440,8 +450,7 @@
         params.put(TreeElement.TREE_ID, _trs.tagId);
         String uri = null;
         try {
-            uri = 
PageFlowUtils.getRewrittenActionURI(_servletContext,request,response,action,params,null,false);
-            //uri = PageFlowTagUtils.rewriteActionURL(pageContext, action, 
params, null);
+            uri = 
PageFlowUtils.getRewrittenActionURI(_servletContext,_req,_res,action,params,null,false);
         }
         catch (URISyntaxException e) {
             // report the error...
@@ -453,7 +462,7 @@
         boolean ret = false;
         if ((uri != null) && !node.isLeaf()) {
             _anchorState.clear();
-            _anchorState.href = response.encodeURL(uri);
+            _anchorState.href = _res.encodeURL(uri);
             _anchorState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
TARGET, _iState.getExpandTarget());
             sb.append("      ");
             StringBuilderRenderAppender writer = new 
StringBuilderRenderAppender(sb);
@@ -479,7 +488,7 @@
             _anchorState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
TreeElement.TREE_ANCHOR,
                     (expanded ? TreeElement.TREE_EXPAND_STATE : 
TreeElement.TREE_COLLAPSE_STATE));
             _anchorState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
TreeElement.TREE_ANCHOR_ID, encodedNodeName);
-            if (node.isExpandOnServer()) {
+            if (node.isExpandOnServer() && !node.isExpanded()) {
                 _anchorState.registerAttribute(AbstractHtmlState.ATTR_GENERAL, 
TreeElement.TREE_EXPAND, "true");
             }
 

Modified: 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeRootElement.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeRootElement.java?view=diff&rev=149075&p1=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeRootElement.java&r1=149074&p2=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeRootElement.java&r2=149075
==============================================================================
--- 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeRootElement.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/tree/TreeRootElement.java
 Sat Jan 29 14:04:50 2005
@@ -25,6 +25,7 @@
 public class TreeRootElement extends TreeElement implements ITreeRootElement
 {
     private TreeElement _selectedNode;
+    private TreeRenderState _trs;
     private String _name = null;
 
     private static final Logger logger = 
Logger.getInstance(TreeRootElement.class);
@@ -73,6 +74,14 @@
         n.setSelected(true);
         _selectedNode = n;
         return;
+    }
+
+    public TreeRenderState getTreeRenderState() {
+        return _trs;
+    }
+    
+    public void setTreeRenderState(TreeRenderState trs) {
+        _trs = trs;
     }
 
     public void setObjectName(String name)

Reply via email to