Author: tmjee
Date: Sat May 20 09:11:06 2006
New Revision: 408016

URL: http://svn.apache.org/viewvc?rev=408016&view=rev
Log:
WW-1316


Added:
    
struts/action2/trunk/core/src/main/resources/org/apache/struts/action2/static/tree.css
   (with props)
    
struts/action2/trunk/core/src/test/java/org/apache/struts/action2/views/jsp/ui/Category.java
   (with props)
    
struts/action2/trunk/core/src/test/java/org/apache/struts/action2/views/jsp/ui/TreeTest.java
   (with props)
    
struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/tree-1.txt
   (with props)
    
struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/tree-2.txt
   (with props)
Modified:
    
struts/action2/trunk/core/src/main/java/org/apache/struts/action2/components/Tree.java
    
struts/action2/trunk/core/src/main/java/org/apache/struts/action2/views/jsp/ui/TreeNodeTag.java
    
struts/action2/trunk/core/src/main/java/org/apache/struts/action2/views/jsp/ui/TreeTag.java
    struts/action2/trunk/core/src/main/resources/META-INF/taglib.tld
    struts/action2/trunk/core/src/main/resources/template/ajax/tree.ftl
    struts/action2/trunk/core/src/main/resources/template/ajax/treenode.ftl

Modified: 
struts/action2/trunk/core/src/main/java/org/apache/struts/action2/components/Tree.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/core/src/main/java/org/apache/struts/action2/components/Tree.java?rev=408016&r1=408015&r2=408016&view=diff
==============================================================================
--- 
struts/action2/trunk/core/src/main/java/org/apache/struts/action2/components/Tree.java
 (original)
+++ 
struts/action2/trunk/core/src/main/java/org/apache/struts/action2/components/Tree.java
 Sat May 20 09:11:06 2006
@@ -25,17 +25,34 @@
  * description="Render a tree widget."
  */
 public class Tree extends ClosingUIBean {
-    private static final String TEMPLATE = "tree-close";
+    
+       private static final String TEMPLATE = "tree-close";
     private static final String OPEN_TEMPLATE = "tree";
+    
     private String toggle = "fade";
     private String treeSelectedTopic;
     private String treeExpandedTopic;
     private String treeCollapsedTopic;
-    private String openAll;
     protected String rootNodeAttr;
     protected String childCollectionProperty;
     protected String nodeTitleProperty;
     protected String nodeIdProperty;
+    private String showRootGrid;
+    
+    private String showGrid;
+    private String blankIconSrc;
+       private String gridIconSrcL;
+       private String gridIconSrcV;
+       private String gridIconSrcP;
+       private String gridIconSrcC;
+       private String gridIconSrcX;
+       private String gridIconSrcY;
+       private String expandIconSrcPlus;
+       private String expandIconSrcMinus;
+       private String iconWidth;
+       private String iconHeight;
+       private String toggleDuration;
+    private String templateCssPath;
 
     public Tree(OgnlValueStack stack, HttpServletRequest request, 
HttpServletResponse response) {
         super(stack, request, response);
@@ -75,8 +92,6 @@
             addParameter("treeCollapsedTopic", findString(treeCollapsedTopic));
         }
 
-        addParameter("openAll", Boolean.valueOf(openAll));
-
         if (rootNodeAttr != null) {
             addParameter("rootNode", findValue(rootNodeAttr));
         }
@@ -92,6 +107,64 @@
         if (nodeIdProperty != null) {
             addParameter("nodeIdProperty", findString(nodeIdProperty));
         }
+        
+        if (showRootGrid != null) {
+               addParameter("showRootGrid", findValue(showRootGrid, 
Boolean.class));
+        }
+        
+        
+        if (showGrid != null) {
+               addParameter("showGrid", findValue(showGrid, Boolean.class));
+        }
+        
+        if (blankIconSrc != null) {
+               addParameter("blankIconSrc", findString(blankIconSrc));
+        }
+        
+       if (gridIconSrcL != null) {
+               addParameter("gridIconSrcL", findString(gridIconSrcL));
+       }
+       
+       if (gridIconSrcV != null) {
+               addParameter("gridIconSrcV", findString(gridIconSrcV));
+       }
+       
+       if (gridIconSrcP != null)  {
+               addParameter("gridIconSrcP", findString(gridIconSrcP));
+       }
+       
+       if (gridIconSrcC != null) {
+               addParameter("gridIconSrcC", findString(gridIconSrcC));
+       }
+       
+       if (gridIconSrcX != null) {
+               addParameter("gridIconSrcX", findString(gridIconSrcX));
+       }
+       
+       if (gridIconSrcY != null) {
+               addParameter("gridIconSrcY", findString(gridIconSrcY));
+       }
+       
+       if (expandIconSrcPlus != null) {
+               addParameter("expandIconSrcPlus", 
findString(expandIconSrcPlus));
+       }
+       
+       if (expandIconSrcMinus != null) {
+               addParameter("expandIconSrcMinus", 
findString(expandIconSrcMinus));
+       }
+       
+       if (iconWidth != null) {
+               addParameter("iconWidth", findValue(iconWidth, Integer.class));
+       }
+       if (iconHeight != null) {
+               addParameter("iconHeight", findValue(iconHeight, 
Integer.class));
+       }
+       if (toggleDuration != null) {
+               addParameter("toggleDuration", findValue(toggleDuration, 
Integer.class));
+       }
+        if (templateCssPath != null) {
+               addParameter("templateCssPath", findString(templateCssPath));
+        }
     }
 
     public String getDefaultOpenTemplate() {
@@ -107,7 +180,7 @@
     }
 
     /**
-     * The toggle property.
+     * The toggle property (either 'explode' or 'fade'). Default is 'fade'.
      * @a2.tagattribute required="false"
      */
     public void setToggle(String toggle) {
@@ -150,18 +223,6 @@
         this.treeCollapsedTopic = treeCollapsedTopic;
     }
 
-    public String getOpenAll() {
-        return openAll;
-    }
-
-    /**
-     * The openAll property.
-     * @a2.tagattribute required="false" type="boolean" default="false"
-     */
-    public void setOpenAll(String openAll) {
-        this.openAll = openAll;
-    }
-
     public String getRootNode() {
         return rootNodeAttr;
     }
@@ -209,7 +270,189 @@
     public void setNodeIdProperty(String nodeIdProperty) {
         this.nodeIdProperty = nodeIdProperty;
     }
-
-
+    
+    /**
+     * The showRootGrid property (default true).
+     * @a2.tagattribute required="false"
+     */
+    public void setShowRootGrid(String showRootGrid) {
+       this.showRootGrid = showRootGrid;
+    }
+    
+    public String getShowRootGrid() {
+       return showRootGrid;
+    }
+
+       public String getBlankIconSrc() {
+               return blankIconSrc;
+       }
+
+       /**
+        * Blank icon image source.
+        * @a2.tagattribute required="false"
+        */
+       public void setBlankIconSrc(String blankIconSrc) {
+               this.blankIconSrc = blankIconSrc;
+       }
+
+       public String getExpandIconSrcMinus() {
+               return expandIconSrcMinus;
+       }
+
+       /**
+        * Expand icon (-) image source.
+        * @a2.tagattribute required="false"
+        */
+       public void setExpandIconSrcMinus(String expandIconSrcMinus) {
+               this.expandIconSrcMinus = expandIconSrcMinus;
+       }
+
+       public String getExpandIconSrcPlus() {
+               return expandIconSrcPlus;
+       }
+
+       /**
+        * Expand Icon (+) image source.
+        * @a2.tagattribute required="false"
+        */
+       public void setExpandIconSrcPlus(String expandIconSrcPlus) {
+               this.expandIconSrcPlus = expandIconSrcPlus;
+       }
+
+       public String getGridIconSrcC() {
+               return gridIconSrcC;
+       }
+
+       /**
+        * Image source for under child item child icons.
+        * @a2.tagattribute required="false"
+        */
+       public void setGridIconSrcC(String gridIconSrcC) {
+               this.gridIconSrcC = gridIconSrcC;
+       }
+
+       public String getGridIconSrcL() {
+               return gridIconSrcL;
+       }
+
+       
+       /**
+        * Image source for last child grid.
+        * @a2.tagattribute required="false"
+        */
+       public void setGridIconSrcL(String gridIconSrcL) {
+               this.gridIconSrcL = gridIconSrcL;
+       }
+
+       public String getGridIconSrcP() {
+               return gridIconSrcP;
+       }
+
+       /**
+        * Image source for under parent item child icons.
+        * @a2.tagattribute required="false"
+        */
+       public void setGridIconSrcP(String gridIconSrcP) {
+               this.gridIconSrcP = gridIconSrcP;
+       }
+
+       public String getGridIconSrcV() {
+               return gridIconSrcV;
+       }
+
+       /**
+        * Image source for vertical line.
+        * @a2.tagattribute required="false"
+        */
+       public void setGridIconSrcV(String gridIconSrcV) {
+               this.gridIconSrcV = gridIconSrcV;
+       }
+
+       public String getGridIconSrcX() {
+               return gridIconSrcX;
+       }
+
+       /**
+        * Image source for grid for sole root item.
+        * @a2.tagattribute required="false"
+        */
+       public void setGridIconSrcX(String gridIconSrcX) {
+               this.gridIconSrcX = gridIconSrcX;
+       }
+
+       public String getGridIconSrcY() {
+               return gridIconSrcY;
+       }
+
+       /**
+        * Image source for grid for last root item.
+        * @a2.tagattribute required="false"
+        */
+       public void setGridIconSrcY(String gridIconSrcY) {
+               this.gridIconSrcY = gridIconSrcY;
+       }
+
+       public String getIconHeight() {
+               return iconHeight;
+       }
+
+       
+       /**
+        * Icon height (default 18 pixels).
+        * @a2.tagattribute required="false"
+        */
+       public void setIconHeight(String iconHeight) {
+               this.iconHeight = iconHeight;
+       }
+
+       public String getIconWidth() {
+               return iconWidth;
+       }
+
+       /**
+        * Icon width (default 19 pixels).
+        * @a2.tagattribute required="false"
+        */
+       public void setIconWidth(String iconWidth) {
+               this.iconWidth = iconWidth;
+       }
+
+       
+
+       public String getTemplateCssPath() {
+               return templateCssPath;
+       }
+
+       /**
+        * Template css path (default {contextPath}/struts/tree.css.
+        * @a2.tagattribute required="false"
+        */
+       public void setTemplateCssPath(String templateCssPath) {
+               this.templateCssPath = templateCssPath;
+       }
+
+       public String getToggleDuration() {
+               return toggleDuration;
+       }
+
+       /**
+        * Toggle duration (default 150 ms)
+        * @a2.tagattribute required="false"
+        */
+       public void setToggleDuration(String toggleDuration) {
+               this.toggleDuration = toggleDuration;
+       }
+
+       public String getShowGrid() {
+               return showGrid;
+       }
+
+       /**
+        * Show grid (default true).
+        * @a2.tagattribute required="false"
+        */
+       public void setShowGrid(String showGrid) {
+               this.showGrid = showGrid;
+       }
 }
 

Modified: 
struts/action2/trunk/core/src/main/java/org/apache/struts/action2/views/jsp/ui/TreeNodeTag.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/core/src/main/java/org/apache/struts/action2/views/jsp/ui/TreeNodeTag.java?rev=408016&r1=408015&r2=408016&view=diff
==============================================================================
--- 
struts/action2/trunk/core/src/main/java/org/apache/struts/action2/views/jsp/ui/TreeNodeTag.java
 (original)
+++ 
struts/action2/trunk/core/src/main/java/org/apache/struts/action2/views/jsp/ui/TreeNodeTag.java
 Sat May 20 09:11:06 2006
@@ -31,7 +31,6 @@
        
        private static final long serialVersionUID = 7340746943017900803L;
        
-       private String label;
 
     public Component getBean(OgnlValueStack stack, HttpServletRequest req, 
HttpServletResponse res) {
         return new TreeNode(stack,req,res);
@@ -41,11 +40,11 @@
         this.label = label;
     }
 
-    protected void populateParams() {
+    /*protected void populateParams() {
         if (label != null) {
             TreeNode treeNode = (TreeNode)component;
             treeNode.setLabel(label);
         }
         super.populateParams();
-    }
+    }*/
 }

Modified: 
struts/action2/trunk/core/src/main/java/org/apache/struts/action2/views/jsp/ui/TreeTag.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/core/src/main/java/org/apache/struts/action2/views/jsp/ui/TreeTag.java?rev=408016&r1=408015&r2=408016&view=diff
==============================================================================
--- 
struts/action2/trunk/core/src/main/java/org/apache/struts/action2/views/jsp/ui/TreeTag.java
 (original)
+++ 
struts/action2/trunk/core/src/main/java/org/apache/struts/action2/views/jsp/ui/TreeTag.java
 Sat May 20 09:11:06 2006
@@ -34,15 +34,30 @@
        private String toggle;
     private String treeSelectedTopic;
     private String treeExpandedTopic;
-    private String treeCollapsedTopic;
-    private String openAll;
+    private String treeCollapsedTopic; 
     private String rootNode;
     private String childCollectionProperty;
     private String nodeTitleProperty;
     private String nodeIdProperty;
+    private String showRootGrid;
+    
+    private String showGrid;
+       private String blankIconSrc;
+       private String gridIconSrcL;
+       private String gridIconSrcV;
+       private String gridIconSrcP;
+       private String gridIconSrcC;
+       private String gridIconSrcX;
+       private String gridIconSrcY;
+       private String expandIconSrcPlus;
+       private String expandIconSrcMinus;
+       private String iconWidth;
+       private String iconHeight;
+       private String toggleDuration;
+    private String templateCssPath;
+     
 
-
-    public Component getBean(OgnlValueStack stack, HttpServletRequest req, 
HttpServletResponse res) {
+       public Component getBean(OgnlValueStack stack, HttpServletRequest req, 
HttpServletResponse res) {
         return new Tree(stack,req,res);
     }
 
@@ -50,15 +65,53 @@
         super.populateParams();
 
         Tree tree = (Tree) component;
-        tree.setChildCollectionProperty(childCollectionProperty);
-        tree.setNodeIdProperty(nodeIdProperty);
-        tree.setNodeTitleProperty(nodeTitleProperty);
-        tree.setOpenAll(openAll);
-        tree.setRootNode(rootNode);
-        tree.setToggle(toggle);
-        tree.setTreeCollapsedTopic(treeCollapsedTopic);
-        tree.setTreeExpandedTopic(treeExpandedTopic);
-        tree.setTreeSelectedTopic(treeSelectedTopic);
+        if (childCollectionProperty != null)
+               tree.setChildCollectionProperty(childCollectionProperty);
+        if (nodeIdProperty != null)
+               tree.setNodeIdProperty(nodeIdProperty);
+        if (nodeTitleProperty != null)
+               tree.setNodeTitleProperty(nodeTitleProperty);
+        if (rootNode != null)
+               tree.setRootNode(rootNode);
+        if (toggle != null)
+               tree.setToggle(toggle);
+        if (treeCollapsedTopic != null)
+               tree.setTreeCollapsedTopic(treeCollapsedTopic);
+        if (treeExpandedTopic != null)
+               tree.setTreeExpandedTopic(treeExpandedTopic);
+        if (treeSelectedTopic != null)
+               tree.setTreeSelectedTopic(treeSelectedTopic);
+        if (showRootGrid != null)
+               tree.setShowRootGrid(showRootGrid);
+        
+        if (showGrid != null)
+               tree.setShowGrid(showGrid);
+        if (blankIconSrc != null)
+               tree.setBlankIconSrc(blankIconSrc);
+        if (gridIconSrcL != null)
+               tree.setGridIconSrcL(gridIconSrcC);
+        if (gridIconSrcV != null) 
+               tree.setGridIconSrcV(gridIconSrcV);
+        if (gridIconSrcP != null)
+               tree.setGridIconSrcP(gridIconSrcP);
+        if (gridIconSrcC != null)
+               tree.setGridIconSrcC(gridIconSrcC);
+        if (gridIconSrcX != null)
+               tree.setGridIconSrcX(gridIconSrcX);
+        if (gridIconSrcY != null)
+               tree.setGridIconSrcY(gridIconSrcY);
+        if (expandIconSrcPlus != null) 
+               tree.setExpandIconSrcPlus(expandIconSrcPlus);
+       if (expandIconSrcMinus != null) 
+               tree.setExpandIconSrcMinus(expandIconSrcMinus);
+       if (iconWidth != null) 
+               tree.setIconWidth(iconWidth);
+       if (iconHeight != null)
+               tree.setIconHeight(iconHeight);
+       if (toggleDuration != null)
+               tree.setToggleDuration(toggleDuration);
+       if (templateCssPath != null)
+               tree.setTemplateCssPath(templateCssPath);
     }
 
     public String getToggle() {
@@ -93,14 +146,6 @@
         this.treeCollapsedTopic = treeCollapsedTopic;
     }
 
-    public String getOpenAll() {
-        return openAll;
-    }
-
-    public void setOpenAll(String openAll) {
-        this.openAll = openAll;
-    }
-
     public String getRootNode() {
         return rootNode;
     }
@@ -132,5 +177,125 @@
     public void setNodeIdProperty(String nodeIdProperty) {
         this.nodeIdProperty = nodeIdProperty;
     }
+    
+    public String getShowRootGrid() {
+       return showRootGrid;
+    }
+    
+    public void setShowRootGrid(String showRootGrid) {
+       this.showRootGrid = showRootGrid;
+    }
+    
+    public String getBlankIconSrc() {
+               return blankIconSrc;
+       }
+
+       public void setBlankIconSrc(String blankIconSrc) {
+               this.blankIconSrc = blankIconSrc;
+       }
+
+       public String getExpandIconSrcMinus() {
+               return expandIconSrcMinus;
+       }
+
+       public void setExpandIconSrcMinus(String expandIconSrcMinus) {
+               this.expandIconSrcMinus = expandIconSrcMinus;
+       }
+
+       public String getExpandIconSrcPlus() {
+               return expandIconSrcPlus;
+       }
+
+       public void setExpandIconSrcPlus(String expandIconSrcPlus) {
+               this.expandIconSrcPlus = expandIconSrcPlus;
+       }
+
+       public String getGridIconSrcC() {
+               return gridIconSrcC;
+       }
+
+       public void setGridIconSrcC(String gridIconSrcC) {
+               this.gridIconSrcC = gridIconSrcC;
+       }
+
+       public String getGridIconSrcL() {
+               return gridIconSrcL;
+       }
+
+       public void setGridIconSrcL(String gridIconSrcL) {
+               this.gridIconSrcL = gridIconSrcL;
+       }
+
+       public String getGridIconSrcP() {
+               return gridIconSrcP;
+       }
+
+       public void setGridIconSrcP(String gridIconSrcP) {
+               this.gridIconSrcP = gridIconSrcP;
+       }
+
+       public String getGridIconSrcV() {
+               return gridIconSrcV;
+       }
+
+       public void setGridIconSrcV(String gridIconSrcV) {
+               this.gridIconSrcV = gridIconSrcV;
+       }
+
+       public String getGridIconSrcX() {
+               return gridIconSrcX;
+       }
+
+       public void setGridIconSrcX(String gridIconSrcX) {
+               this.gridIconSrcX = gridIconSrcX;
+       }
+
+       public String getGridIconSrcY() {
+               return gridIconSrcY;
+       }
+
+       public void setGridIconSrcY(String gridIconSrcY) {
+               this.gridIconSrcY = gridIconSrcY;
+       }
+
+       public String getIconHeight() {
+               return iconHeight;
+       }
+
+       public void setIconHeight(String iconHeight) {
+               this.iconHeight = iconHeight;
+       }
+
+       public String getIconWidth() {
+               return iconWidth;
+       }
+
+       public void setIconWidth(String iconWidth) {
+               this.iconWidth = iconWidth;
+       }
+
+       public String getTemplateCssPath() {
+               return templateCssPath;
+       }
+
+       public void setTemplateCssPath(String templateCssPath) {
+               this.templateCssPath = templateCssPath;
+       }
+
+       public String getToggleDuration() {
+               return toggleDuration;
+       }
+
+       public void setToggleDuration(String toggleDuration) {
+               this.toggleDuration = toggleDuration;
+       }
+
+       public String getShowGrid() {
+               return showGrid;
+       }
+
+       public void setShowGrid(String showGrid) {
+               this.showGrid = showGrid;
+       }
 }
 

Modified: struts/action2/trunk/core/src/main/resources/META-INF/taglib.tld
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/core/src/main/resources/META-INF/taglib.tld?rev=408016&r1=408015&r2=408016&view=diff
==============================================================================
--- struts/action2/trunk/core/src/main/resources/META-INF/taglib.tld (original)
+++ struts/action2/trunk/core/src/main/resources/META-INF/taglib.tld Sat May 20 
09:11:06 2006
@@ -132,6 +132,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -477,6 +485,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -1007,6 +1023,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -1313,6 +1337,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -1648,7 +1680,7 @@
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
 
-           <description><![CDATA[The toggle property.]]></description>
+           <description><![CDATA[The toggle property (either 'explode' or 
'fade'). Default is 'fade'.]]></description>
 
       </attribute>
       <attribute>
@@ -1676,14 +1708,6 @@
 
       </attribute>
       <attribute>
-         <name>openAll</name>
-         <required>false</required>
-         <rtexprvalue>true</rtexprvalue>
-
-           <description><![CDATA[The openAll property.]]></description>
-
-      </attribute>
-      <attribute>
          <name>rootNode</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -1716,6 +1740,126 @@
 
       </attribute>
       <attribute>
+         <name>showRootGrid</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The showRootGrid property (default 
true).]]></description>
+
+      </attribute>
+      <attribute>
+         <name>blankIconSrc</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[Blank icon image source.]]></description>
+
+      </attribute>
+      <attribute>
+         <name>expandIconSrcMinus</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[Expand icon (-) image source.]]></description>
+
+      </attribute>
+      <attribute>
+         <name>expandIconSrcPlus</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[Expand Icon (+) image source.]]></description>
+
+      </attribute>
+      <attribute>
+         <name>gridIconSrcC</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[Image source for under child item child 
icons.]]></description>
+
+      </attribute>
+      <attribute>
+         <name>gridIconSrcL</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[Image source for last child 
grid.]]></description>
+
+      </attribute>
+      <attribute>
+         <name>gridIconSrcP</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[Image source for under parent item child 
icons.]]></description>
+
+      </attribute>
+      <attribute>
+         <name>gridIconSrcV</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[Image source for vertical 
line.]]></description>
+
+      </attribute>
+      <attribute>
+         <name>gridIconSrcX</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[Image source for grid for sole root 
item.]]></description>
+
+      </attribute>
+      <attribute>
+         <name>gridIconSrcY</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[Image source for grid for last root 
item.]]></description>
+
+      </attribute>
+      <attribute>
+         <name>iconHeight</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[Icon height (default 18 
pixels).]]></description>
+
+      </attribute>
+      <attribute>
+         <name>iconWidth</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[Icon width (default 19 
pixels).]]></description>
+
+      </attribute>
+      <attribute>
+         <name>templateCssPath</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[Template css path (default 
{contextPath}/struts/tree.css.]]></description>
+
+      </attribute>
+      <attribute>
+         <name>toggleDuration</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[Toggle duration (default 150 
ms)]]></description>
+
+      </attribute>
+      <attribute>
+         <name>showGrid</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[Show grid (default true).]]></description>
+
+      </attribute>
+      <attribute>
          <name>openTemplate</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -1724,6 +1868,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -2285,6 +2437,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -3006,6 +3166,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -3376,6 +3544,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -3845,6 +4021,14 @@
       <description><![CDATA[Render a hidden input field]]></description>
 
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -4102,6 +4286,14 @@
       <description><![CDATA[Stop double-submission of forms]]></description>
 
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -4359,6 +4551,14 @@
       <description><![CDATA[Render field error (all or partial depending on 
param tag nested)if they exists]]></description>
 
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -4641,6 +4841,14 @@
       <description><![CDATA[Render action messages if they 
exists]]></description>
 
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -4995,6 +5203,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>template</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -5334,6 +5550,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -5631,6 +5855,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -6304,6 +6536,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -6569,6 +6809,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -6923,6 +7171,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -7245,6 +7501,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -7518,6 +7782,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -7807,6 +8079,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -8064,6 +8344,14 @@
       <description><![CDATA[Render action errors if they 
exists]]></description>
 
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -8337,6 +8625,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -8675,6 +8971,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -8948,6 +9252,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -9205,6 +9517,14 @@
       <description><![CDATA[Render debug tag]]></description>
 
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -9494,6 +9814,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -9775,6 +10103,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -10104,6 +10440,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>template</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -10377,6 +10721,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -10698,6 +11050,14 @@
 
       </attribute>
       <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
+
+      </attribute>
+      <attribute>
          <name>theme</name>
          <required>false</required>
          <rtexprvalue>true</rtexprvalue>
@@ -11081,6 +11441,14 @@
          <rtexprvalue>true</rtexprvalue>
 
            <description><![CDATA[Set template to use for opening the rendered 
html.]]></description>
+
+      </attribute>
+      <attribute>
+         <name>templateDir</name>
+         <required>false</required>
+         <rtexprvalue>true</rtexprvalue>
+
+           <description><![CDATA[The template directory.]]></description>
 
       </attribute>
       <attribute>

Added: 
struts/action2/trunk/core/src/main/resources/org/apache/struts/action2/static/tree.css
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/core/src/main/resources/org/apache/struts/action2/static/tree.css?rev=408016&view=auto
==============================================================================
--- 
struts/action2/trunk/core/src/main/resources/org/apache/struts/action2/static/tree.css
 (added)
+++ 
struts/action2/trunk/core/src/main/resources/org/apache/struts/action2/static/tree.css
 Sat May 20 09:11:06 2006
@@ -0,0 +1,29 @@
+.dojoTree {
+       font: caption;
+       font-size: 11px;
+       font-weight: normal;
+       overflow: auto;
+}
+
+.dojoTreeNodeLabel {
+       padding: 1px 2px;
+       color: WindowText;
+       cursor: default;
+}
+
+.dojoTreeNodeLabel:hover {
+       text-decoration: underline;
+}
+
+.dojoTreeNodeLabelSelected {
+       background-color: Highlight;
+       color: HighlightText;
+}
+
+.dojoTree div {
+       white-space: nowrap;
+}
+
+.dojoTree img {
+       vertical-align: middle;
+}

Propchange: 
struts/action2/trunk/core/src/main/resources/org/apache/struts/action2/static/tree.css
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: struts/action2/trunk/core/src/main/resources/template/ajax/tree.ftl
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/core/src/main/resources/template/ajax/tree.ftl?rev=408016&r1=408015&r2=408016&view=diff
==============================================================================
--- struts/action2/trunk/core/src/main/resources/template/ajax/tree.ftl 
(original)
+++ struts/action2/trunk/core/src/main/resources/template/ajax/tree.ftl Sat May 
20 09:11:06 2006
@@ -6,8 +6,58 @@
         // dojo.hostenv.writeIncludes();
         -->
  </script>
-<div dojoType="Tree" showRootGrid="false" 
templateCssPath="${base}/css/Tree.css"
-    <#if parameters.id?exists>id="${parameters.id?html}"</#if>
+<div dojoType="Tree"   
+       <#if parameters.blankIconSrc?exists>
+       gridIconSrcT="<@saf.url value='${parameters.blankIconSrc}' 
encode="false" />"
+       </#if>
+       <#if parameters.gridIconSrcL?exists>
+       gridIconSrcL="<@saf.url value='${parameters.gridIconSrcL}' 
encode="false" />"
+       </#if>
+       <#if parameters.gridIconSrcV?exists>
+       gridIconSrcV="<@saf.url value='${parameters.gridIconSrcV}' 
encode="false" />"
+       </#if>
+       <#if parameters.gridIconSrcP?exists>
+       gridIconSrcP="<@saf.url value='${parameters.gridIconSrcP}' 
encode="false" />"
+       </#if>
+       <#if parameters.gridIconSrcC?exists>
+       gridIconSrcC="<@saf.url value='${parameters.gridIconSrcC}' 
encode="false" />"
+       </#if>
+       <#if parameters.gridIconSrcX?exists>
+       gridIconSrcX="<@saf.url value='${parameters.gridIconSrcX}' 
encode="false" />"
+       </#if>
+       <#if parameters.gridIconSrcY?exists>
+       gridIconSrcY="<@saf.url value='${parameters.gridIconSrcY}' 
encode="false" />"
+       </#if>
+       <#if parameters.gridIconSrcZ?exists>
+       gridIconSrcZ="<@saf.url value='${parameters.gridIconSrcZ}' 
encode="false" />"
+       </#if>
+       <#if parameters.expandIconSrcPlus?exists>
+       expandIconSrcPlus="<@saf.url value='${parameters.expandIconSrcPlus}' />"
+       </#if>
+       <#if parameters.expandIconSrcMinus?exists>
+       expandIconSrcMinus="<@saf.url 
value='${parameters.expandIconSrcMinus?html}' />"
+       </#if>
+       <#if parameters.iconWidth?exists>
+       iconWidth="<@saf.url value='${parameters.iconWidth?html}' 
encode="false" />"
+       </#if>
+       <#if parameters.iconHeight?exists>
+       iconHeight="<@saf.url value='${parameters.iconHeight?html}' 
encode="false" />"
+       </#if>
+       <#if parameters.toggleDuration?exists>
+       toggleDuration=${parameters.toggleDuration?c}
+       </#if>
+       <#if parameters.templateCssPath?exists>
+       templateCssPath="<@saf.url value='${parameters.templateCssPath}' 
encode="false" />"
+       </#if>
+       <#if parameters.showGrid?exists>
+       showGrid="${parameters.showGrid?default(true)?string}"
+       </#if>
+       <#if parameters.showRootGrid?exists>
+       showRootGrid="${parameters.showRootGrid?default(true)?string}"
+       </#if>
+    <#if parameters.id?exists>
+    id="${parameters.id?html}"
+    </#if>
     <#if parameters.treeSelectedTopic?exists>
     publishSelectionTopic="${parameters.treeSelectedTopic?html}"
     </#if>
@@ -18,14 +68,11 @@
     publishCollapsedTopic="${parameters.treeCollapsedTopic?html}"
     </#if>
     <#if parameters.toggle?exists>
-    toggle="${parameters.toggle}"
-    </#if>
-    <#if parameters.openAll?exists>
-    openAll="${parameters.openAll?string}"
+    toggle="${parameters.toggle?html}"
     </#if>
     >
     <#if parameters.label?exists>
-    <div dojoType="TreeNode" title="${parameters.label?html}"
+    <div dojoType="TreeNode" id="${parameters.id}_root" 
title="${parameters.label?html}"
     <#if parameters.nodeIdProperty?exists>
     id="${stack.findValue(parameters.nodeIdProperty)}"
     </#if>

Modified: 
struts/action2/trunk/core/src/main/resources/template/ajax/treenode.ftl
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/core/src/main/resources/template/ajax/treenode.ftl?rev=408016&r1=408015&r2=408016&view=diff
==============================================================================
--- struts/action2/trunk/core/src/main/resources/template/ajax/treenode.ftl 
(original)
+++ struts/action2/trunk/core/src/main/resources/template/ajax/treenode.ftl Sat 
May 20 09:11:06 2006
@@ -1,3 +1,6 @@
-<div dojoType="TreeNode"
+<div dojoType="TreeNode" 
+       <#if parameters.childIconSrc?exists>
+       childIconSrc="<@saf.url value='${parameters.childIconSrc}' 
encode="false" />"
+       </#if>
     <#if parameters.id?exists>id="${parameters.id?html}"</#if>
-    title="${parameters.label?html}">
+    title="${parameters.label}">

Added: 
struts/action2/trunk/core/src/test/java/org/apache/struts/action2/views/jsp/ui/Category.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/core/src/test/java/org/apache/struts/action2/views/jsp/ui/Category.java?rev=408016&view=auto
==============================================================================
--- 
struts/action2/trunk/core/src/test/java/org/apache/struts/action2/views/jsp/ui/Category.java
 (added)
+++ 
struts/action2/trunk/core/src/test/java/org/apache/struts/action2/views/jsp/ui/Category.java
 Sat May 20 09:11:06 2006
@@ -0,0 +1,104 @@
+/*
+ * $Id: AbstractUITagTest.java 394477 2006-04-16 12:50:53Z tmjee $
+ *
+ * Copyright 2006 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.struts.action2.views.jsp.ui;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Used by Tree Component Test. Copied from showcase.
+ */
+public class Category {
+       private static Map<Long, Category> catMap = new HashMap<Long, 
Category>();
+
+    static {
+        new Category(1, "Root",
+                new Category(2, "Java",
+                        new Category(3, "Web Frameworks",
+                                new Category(4, "WebWork"),
+                                new Category(5, "Struts Action"),
+                                new Category(6, "Struts Shale"),
+                                new Category(7, "Stripes"),
+                                new Category(8, "Rife")),
+                        new Category(9, "Persistence",
+                                new Category(10, "iBatis"),
+                                new Category(11, "Hibernate"),
+                                new Category(12, "JDO"),
+                                new Category(13, "JDBC"))),
+                new Category(14, "JavaScript",
+                        new Category(15, "Dojo"),
+                        new Category(16, "Prototype"),
+                        new Category(17, "Scriptaculous"),
+                        new Category(18, "OpenRico"),
+                        new Category(19, "DWR")));
+    }
+
+    public static Category getById(long id) {
+        return catMap.get(id);
+    }
+
+    private long id;
+    private String name;
+    private List<Category> children;
+    private boolean toggle;
+
+    public Category(long id, String name, Category... children) {
+        this.id = id;
+        this.name = name;
+        this.children = new ArrayList<Category>();
+        for (Category child : children) {
+            this.children.add(child);
+        }
+
+        catMap.put(id, this);
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public List<Category> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<Category> children) {
+        this.children = children;
+    }
+
+    public void toggle() {
+        toggle = !toggle;
+    }
+
+    public boolean isToggle() {
+        return toggle;
+    }
+}

Propchange: 
struts/action2/trunk/core/src/test/java/org/apache/struts/action2/views/jsp/ui/Category.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/core/src/test/java/org/apache/struts/action2/views/jsp/ui/TreeTest.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/core/src/test/java/org/apache/struts/action2/views/jsp/ui/TreeTest.java?rev=408016&view=auto
==============================================================================
--- 
struts/action2/trunk/core/src/test/java/org/apache/struts/action2/views/jsp/ui/TreeTest.java
 (added)
+++ 
struts/action2/trunk/core/src/test/java/org/apache/struts/action2/views/jsp/ui/TreeTest.java
 Sat May 20 09:11:06 2006
@@ -0,0 +1,133 @@
+/*
+ * $Id: AbstractUITagTest.java 394477 2006-04-16 12:50:53Z tmjee $
+ *
+ * Copyright 2006 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.struts.action2.views.jsp.ui;
+
+import org.apache.struts.action2.views.jsp.AbstractUITagTest;
+
+import com.opensymphony.xwork.Action;
+import com.opensymphony.xwork.ActionSupport;
+
+/**
+ * Test case for Tree component.
+ */
+public class TreeTest extends AbstractUITagTest{
+       
+       public void testStaticTree() throws Exception {
+               // Root
+               TreeTag tag = new TreeTag();
+               tag.setShowRootGrid("false");
+               tag.setShowGrid("false");
+               tag.setTemplateCssPath("/struts/tree.css");
+               tag.setTheme("ajax");
+               tag.setPageContext(pageContext);
+               tag.setId("rootId");
+               tag.setLabel("Root");
+               tag.doStartTag();
+               
+                       // Child 1
+                       TreeNodeTag nodeTag1 = new TreeNodeTag();
+                       nodeTag1.setTheme("ajax");
+                       nodeTag1.setPageContext(pageContext);
+                       nodeTag1.setId("child1");
+                       nodeTag1.setLabel("Child 1");
+                       nodeTag1.doStartTag();
+                       nodeTag1.doEndTag();
+                       
+                       // Child 2
+                       TreeNodeTag nodeTag2 = new TreeNodeTag();
+                       nodeTag2.setTheme("ajax");
+                       nodeTag2.setPageContext(pageContext);
+                       nodeTag2.setId("child2");
+                       nodeTag2.setLabel("Child 2");
+                       nodeTag2.doStartTag();
+                       
+                               // Grand Child 1
+                               TreeNodeTag gNodeTag1 = new TreeNodeTag();
+                               gNodeTag1.setTheme("ajax");
+                               gNodeTag1.setPageContext(pageContext);
+                               gNodeTag1.setId("gChild1");
+                               gNodeTag1.setLabel("Grand Child 1");
+                               gNodeTag1.doStartTag();
+                               gNodeTag1.doEndTag();
+                       
+                               // Grand Child 2
+                               TreeNodeTag gNodeTag2 = new TreeNodeTag();
+                               gNodeTag2.setTheme("ajax");
+                               gNodeTag2.setPageContext(pageContext);
+                               gNodeTag2.setId("gChild2");
+                               gNodeTag2.setLabel("Grand Child 2");
+                               gNodeTag2.doStartTag();
+                               gNodeTag2.doEndTag();
+                       
+                               // Grand Child 3
+                               TreeNodeTag gNodeTag3= new TreeNodeTag();
+                               gNodeTag3.setTheme("ajax");
+                               gNodeTag3.setPageContext(pageContext);
+                               gNodeTag3.setId("gChild3");
+                               gNodeTag3.setLabel("Grand Child 3");
+                               gNodeTag3.doStartTag();
+                               gNodeTag3.doEndTag();
+                               
+                       nodeTag2.doEndTag();
+                       
+                       
+                       // Child 3
+                       TreeNodeTag nodeTag3 = new TreeNodeTag();
+                       nodeTag3.setTheme("ajax");
+                       nodeTag3.setPageContext(pageContext);
+                       nodeTag3.setId("child3");
+                       nodeTag3.setLabel("Child 4");
+                       nodeTag3.doStartTag();
+                       nodeTag3.doEndTag();
+                       
+               tag.doEndTag();
+               
+               //System.out.println(writer.toString());
+               verify(TreeTest.class.getResource("tree-1.txt"));
+       }
+       
+       
+       
+       public void testDynamicTree() throws Exception {
+               
+               TreeTag tag = new TreeTag();
+               tag.setPageContext(pageContext);
+               tag.setTheme("ajax");
+               tag.setId("myTree");
+               tag.setRootNode("%{myTreeRoot}");
+               tag.setNodeIdProperty("id");
+               tag.setNodeTitleProperty("name");
+               tag.setChildCollectionProperty("children");
+               tag.doStartTag();
+               tag.doEndTag();
+               
+               //System.out.println(writer.toString());
+               verify(TreeTest.class.getResource("tree-2.txt"));
+       }
+       
+       
+       public Action getAction() {
+               return new InternalActionSupport();
+       }
+       
+       public static class InternalActionSupport extends ActionSupport {
+               public Category getMyTreeRoot() {
+                       return Category.getById(1);
+               }
+       }
+}

Propchange: 
struts/action2/trunk/core/src/test/java/org/apache/struts/action2/views/jsp/ui/TreeTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/tree-1.txt
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/tree-1.txt?rev=408016&view=auto
==============================================================================
--- 
struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/tree-1.txt
 (added)
+++ 
struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/tree-1.txt
 Sat May 20 09:11:06 2006
@@ -0,0 +1,42 @@
+<script language="JavaScript" type="text/javascript">
+        <!--
+        dojo.require("dojo.lang.*");
+        dojo.require("dojo.widget.*");
+        dojo.require("dojo.widget.Tree");
+        // dojo.hostenv.writeIncludes();
+        -->
+ </script>
+<div dojoType="Tree"   
+               templateCssPath="/struts/tree.css"
+       showGrid="false"
+       showRootGrid="false"
+    id="rootId"
+    toggle="fade"
+    >
+    <div dojoType="TreeNode" id="rootId_root" title="Root"
+    >
+<div dojoType="TreeNode" 
+           id="child1"
+    title="Child 1">
+</div>
+<div dojoType="TreeNode" 
+           id="child2"
+    title="Child 2">
+<div dojoType="TreeNode" 
+           id="gChild1"
+    title="Grand Child 1">
+</div>
+<div dojoType="TreeNode" 
+           id="gChild2"
+    title="Grand Child 2">
+</div>
+<div dojoType="TreeNode" 
+           id="gChild3"
+    title="Grand Child 3">
+</div>
+</div>
+<div dojoType="TreeNode" 
+           id="child3"
+    title="Child 4">
+</div>
+</div></div>
\ No newline at end of file

Propchange: 
struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/tree-1.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/tree-2.txt
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/tree-2.txt?rev=408016&view=auto
==============================================================================
--- 
struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/tree-2.txt
 (added)
+++ 
struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/tree-2.txt
 Sat May 20 09:11:06 2006
@@ -0,0 +1,70 @@
+<script language="JavaScript" type="text/javascript">
+        <!--
+        dojo.require("dojo.lang.*");
+        dojo.require("dojo.widget.*");
+        dojo.require("dojo.widget.Tree");
+        // dojo.hostenv.writeIncludes();
+        -->
+ </script>
+<div dojoType="Tree"   
+           id="myTree"
+    toggle="fade"
+    >
+    
+<div dojoType="TreeNode" title="Root" id="1">
+    
+<div dojoType="TreeNode" title="Java" id="2">
+    
+<div dojoType="TreeNode" title="Web Frameworks" id="3">
+    
+<div dojoType="TreeNode" title="WebWork" id="4">
+</div>
+    
+<div dojoType="TreeNode" title="Struts Action" id="5">
+</div>
+    
+<div dojoType="TreeNode" title="Struts Shale" id="6">
+</div>
+    
+<div dojoType="TreeNode" title="Stripes" id="7">
+</div>
+    
+<div dojoType="TreeNode" title="Rife" id="8">
+</div>
+</div>
+    
+<div dojoType="TreeNode" title="Persistence" id="9">
+    
+<div dojoType="TreeNode" title="iBatis" id="10">
+</div>
+    
+<div dojoType="TreeNode" title="Hibernate" id="11">
+</div>
+    
+<div dojoType="TreeNode" title="JDO" id="12">
+</div>
+    
+<div dojoType="TreeNode" title="JDBC" id="13">
+</div>
+</div>
+</div>
+    
+<div dojoType="TreeNode" title="JavaScript" id="14">
+    
+<div dojoType="TreeNode" title="Dojo" id="15">
+</div>
+    
+<div dojoType="TreeNode" title="Prototype" id="16">
+</div>
+    
+<div dojoType="TreeNode" title="Scriptaculous" id="17">
+</div>
+    
+<div dojoType="TreeNode" title="OpenRico" id="18">
+</div>
+    
+<div dojoType="TreeNode" title="DWR" id="19">
+</div>
+</div>
+</div>
+</div>
\ No newline at end of file

Propchange: 
struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/tree-2.txt
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to