You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lo...@apache.org on 2010/08/13 18:30:42 UTC

svn commit: r985268 - in /myfaces/tobago/trunk: tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/ tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/ tobago-core/src/main/java/org/apache/myfaces/tobago/model/ tobago...

Author: lofwyr
Date: Fri Aug 13 16:30:41 2010
New Revision: 985268

URL: http://svn.apache.org/viewvc?rev=985268&view=rev
Log:
TOBAGO-377: new tree
 - write expand state into the model and no longer in the state
 - clean up

Removed:
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/reference/TreeCommandController.java
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/reference/tree/tree-state.xhtml
Modified:
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITreeNode.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/TreeUtils.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/model/TreeState.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/util/ComponentUtils.java
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/Navigation.java
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TobagoDemoController.java
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TreeController.java
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/WEB-INF/faces-config.xml
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/navigation.jsp
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/navigation.xhtml
    myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeIndentRenderer.java
    myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeListboxNodeRenderer.java
    myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeMenuNodeRenderer.java
    myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeNodeRenderer.java

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITreeNode.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITreeNode.java?rev=985268&r1=985267&r2=985268&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITreeNode.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/component/AbstractUITreeNode.java Fri Aug 13 16:30:41 2010
@@ -18,6 +18,7 @@ package org.apache.myfaces.tobago.intern
  */
 
 import org.apache.myfaces.tobago.compat.FacesUtils;
+import org.apache.myfaces.tobago.component.Attributes;
 import org.apache.myfaces.tobago.component.SupportsMarkup;
 import org.apache.myfaces.tobago.component.TreeModelBuilder;
 import org.apache.myfaces.tobago.config.Configurable;
@@ -25,6 +26,7 @@ import org.apache.myfaces.tobago.event.T
 import org.apache.myfaces.tobago.event.TreeExpansionListener;
 import org.apache.myfaces.tobago.model.MixedTreeModel;
 import org.apache.myfaces.tobago.model.TreePath;
+import org.apache.myfaces.tobago.util.ComponentUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -72,7 +74,7 @@ public abstract class AbstractUITreeNode
 
   @Override
   public void encodeBegin(FacesContext context) throws IOException {
-    AbstractUITree tree = findTree();
+    AbstractUITree tree = ComponentUtils.findAncestor(this, AbstractUITree.class);
     MixedTreeModel mixedModel = tree.getModel();
     mixedModel.onEncodeBegin();
     setPath(mixedModel.getPath());
@@ -84,7 +86,7 @@ public abstract class AbstractUITreeNode
   @Override
   public void encodeEnd(FacesContext context) throws IOException {
     super.encodeEnd(context);
-    AbstractUITree tree = findTree();
+    AbstractUITree tree = ComponentUtils.findAncestor(this, AbstractUITree.class);
     MixedTreeModel mixedModel = tree.getModel();
     mixedModel.onEncodeEnd();
   }
@@ -187,29 +189,24 @@ public abstract class AbstractUITreeNode
 
   public String nodeStateId(FacesContext facesContext) {
     String clientId = getClientId(facesContext);
-    AbstractUITree tree = findTree(this);
+    AbstractUITree tree = ComponentUtils.findAncestor(this, AbstractUITree.class);
     String treeId = tree.getClientId(facesContext);
     return clientId.substring(treeId.length() + 1);
   }
 
-  public AbstractUITree findTree() {
-    return findTree(this);
-  }
-
-  private AbstractUITree findTree(UIComponent component) {
-    while (component != null) {
-      if (component instanceof AbstractUITree) {
-        return (AbstractUITree) component;
-      }
-      component = component.getParent();
-    }
-    return null;
-  }
-
   @Override
   public void broadcast(FacesEvent event) throws AbortProcessingException {
     super.broadcast(event);
     if (event instanceof TreeExpansionEvent) {
+
+      boolean expanded = ((TreeExpansionEvent) event).isNewExpanded();
+
+      if (FacesUtils.hasValueBindingOrValueExpression(this, Attributes.EXPANDED)) {
+        FacesUtils.setValueOfBindingOrExpression(getFacesContext(), expanded, this, Attributes.EXPANDED);
+      } else {
+        setExpanded(expanded);
+      }
+
       FacesUtils.invokeMethodBinding(getFacesContext(), getTreeExpansionListener(), event);
     }
   }

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/TreeUtils.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/TreeUtils.java?rev=985268&r1=985267&r2=985268&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/TreeUtils.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/TreeUtils.java Fri Aug 13 16:30:41 2010
@@ -17,7 +17,6 @@ package org.apache.myfaces.tobago.intern
  * limitations under the License.
  */
 
-import org.apache.myfaces.tobago.event.TreeExpansionEvent;
 import org.apache.myfaces.tobago.internal.component.AbstractUITree;
 import org.apache.myfaces.tobago.internal.component.AbstractUITreeNode;
 import org.apache.myfaces.tobago.model.TreeState;
@@ -28,32 +27,6 @@ public final class TreeUtils {
     // utils class
   }
 
-  public static boolean isExpanded(AbstractUITree tree, AbstractUITreeNode node) {
-    TreeState state = (TreeState) tree.getState();
-    if (state != null) {
-      return state.getExpanded().contains(node.getPath());
-    } else {
-      return node.isExpanded();
-    }
-  }
-
-  public static void setExpanded(AbstractUITree tree, AbstractUITreeNode node, boolean expanded) {
-    boolean oldExpanded = isExpanded(tree, node);
-
-    if (tree.getState() != null) {
-      if (expanded) {
-        ((TreeState) tree.getState()).getExpanded().add(node.getPath());
-      } else {
-        ((TreeState) tree.getState()).getExpanded().remove(node.getPath());
-      }
-    } else {
-      node.setExpanded(expanded);
-    }
-    if (oldExpanded != expanded) {
-      new TreeExpansionEvent(node, node.isExpanded(), expanded).queue();
-    }
-  }
-
   public static boolean isSelected(AbstractUITree tree, AbstractUITreeNode node) {
     TreeState state = (TreeState) tree.getState();
     if (state != null) {

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/model/TreeState.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/model/TreeState.java?rev=985268&r1=985267&r2=985268&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/model/TreeState.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/model/TreeState.java Fri Aug 13 16:30:41 2010
@@ -20,27 +20,22 @@ package org.apache.myfaces.tobago.model;
 import org.apache.commons.lang.StringUtils;
 
 import javax.swing.tree.DefaultMutableTreeNode;
-import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.Set;
 
 /**
  * Manages the state on a Tree:<br />
  * 1. selection: selected tree-nodes<br />
- * 2. expandState: open/close folder state<br />
  * 3. marked: last used action object<br />
  */
 public class TreeState {
 
-  private Set<TreePath> expanded;
   private Set<TreePath> selected;
-  private Set<TreePath> marked; // XXX Wy a set and not only a TreePath?
+  private Set<TreePath> marked; // XXX Why a set and not only a TreePath?
 
   @Deprecated
   private Set<DefaultMutableTreeNode> selection;
   @Deprecated
-  private Set<DefaultMutableTreeNode> expandState;
-  @Deprecated
   private DefaultMutableTreeNode marker;
   @Deprecated
   private DefaultMutableTreeNode lastMarker;
@@ -51,16 +46,10 @@ public class TreeState {
 
   public TreeState() {
     selection = new HashSet<DefaultMutableTreeNode>();
-    expandState = new HashSet<DefaultMutableTreeNode>();
-    expanded = new HashSet<TreePath>();
     selected = new HashSet<TreePath>();
     marked = new HashSet<TreePath>();
   }
 
-  public Set<TreePath> getExpanded() {
-    return expanded;
-  }
-
   public Set<TreePath> getSelected() {
     return selected;
   }
@@ -70,21 +59,11 @@ public class TreeState {
   }
 
   @Deprecated
-  public void addExpandState(DefaultMutableTreeNode expandStateItem) {
-    expandState.add(expandStateItem);
-  }
-
-  @Deprecated
   public void addSelection(DefaultMutableTreeNode selectItem) {
     selection.add(selectItem);
   }
 
   @Deprecated
-  public void clearExpandState() {
-    expandState.clear();
-  }
-
-  @Deprecated
   public void clearSelection() {
     selection.clear();
   }
@@ -100,45 +79,6 @@ public class TreeState {
   }
 
   @Deprecated
-  public void expand(DefaultMutableTreeNode node, int level) {
-    if (level > 0) {
-      if (!expandState.contains(node)) {
-        expandState.add(node);
-      }
-      for (Enumeration i = node.children(); i.hasMoreElements();) {
-        DefaultMutableTreeNode child = (DefaultMutableTreeNode) i.nextElement();
-        expand(child, level - 1);
-      }
-    }
-  }
-
-  /**
-   * Expands all parents which contains selected children.
-   */
-  @Deprecated
-  public void expandSelection() {
-    for (DefaultMutableTreeNode treeNode : selection) {
-      expandTo(treeNode);
-    }
-  }
-
-  @Deprecated
-  public void expandTo(DefaultMutableTreeNode node) {
-    node = (DefaultMutableTreeNode) node.getParent();
-    while (node != null) {
-      if (!expandState.contains(node)) {
-        expandState.add(node);
-      }
-      node = (DefaultMutableTreeNode) node.getParent();
-    }
-  }
-
-  @Deprecated
-  public boolean isExpanded(DefaultMutableTreeNode node) {
-    return expandState.contains(node);
-  }
-
-  @Deprecated
   public boolean isMarked(DefaultMutableTreeNode node) {
     return node != null && node.equals(marker);
   }
@@ -149,16 +89,6 @@ public class TreeState {
   }
 
   @Deprecated
-  public Set<DefaultMutableTreeNode> getExpandState() {
-    return expandState;
-  }
-
-  @Deprecated
-  public void setExpandState(Set<DefaultMutableTreeNode> expandState) {
-    this.expandState = expandState;
-  }
-
-  @Deprecated
   public String getLastCommand() {
     return lastCommand;
   }

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/util/ComponentUtils.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/util/ComponentUtils.java?rev=985268&r1=985267&r2=985268&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/util/ComponentUtils.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/util/ComponentUtils.java Fri Aug 13 16:30:41 2010
@@ -200,7 +200,7 @@ public class ComponentUtils {
   public static <T> T findAncestor(UIComponent component, Class<T> type) {
 
     while (component != null) {
-      if (component.getClass().equals(type)) {
+      if (type.isAssignableFrom(component.getClass())) {
         return (T) component;
       }
       component = component.getParent();

Modified: myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/Navigation.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/Navigation.java?rev=985268&r1=985267&r2=985268&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/Navigation.java (original)
+++ myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/Navigation.java Fri Aug 13 16:30:41 2010
@@ -18,11 +18,11 @@ package org.apache.myfaces.tobago.exampl
  */
 
 import org.apache.myfaces.tobago.context.ResourceManagerUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.myfaces.tobago.example.demo.jsp.JspFormatter;
 import org.apache.myfaces.tobago.model.TreePath;
 import org.apache.myfaces.tobago.model.TreeState;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
@@ -34,10 +34,6 @@ import java.io.InputStreamReader;
 import java.io.PrintWriter;
 import java.util.Enumeration;
 
-/*
- * Date: 09.01.2007
- * Time: 10:41:49
- */
 public class Navigation {
 
   private static final Logger LOG = LoggerFactory.getLogger(Navigation.class);
@@ -95,10 +91,11 @@ public class Navigation {
     reference.add(new DefaultMutableTreeNode(new Node("reference_upload", "reference/upload")));
     tree.add(reference);
 
+    ((Node) tree.getUserObject()).setExpanded(true);
+    ((Node) overview.getUserObject()).setExpanded(true);
+    ((Node) bestPractice.getUserObject()).setExpanded(true);
+
     state = new TreeState();
-    state.getExpanded().add(new TreePath(0));
-    state.getExpanded().add(new TreePath(0, 0));
-    state.getExpanded().add(new TreePath(0, 1));
     state.getMarked().add(new TreePath(0, 0));
   }
 
@@ -194,6 +191,7 @@ public class Navigation {
     private String title;
     private String id;
     private String outcome;
+    private boolean expanded;
 
 
     public Node(String key, String outcome) {
@@ -233,5 +231,13 @@ public class Navigation {
     public void setOutcome(String outcome) {
       this.outcome = outcome;
     }
+
+    public boolean isExpanded() {
+      return expanded;
+    }
+
+    public void setExpanded(boolean expanded) {
+      this.expanded = expanded;
+    }
   }
 }

Modified: myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TobagoDemoController.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TobagoDemoController.java?rev=985268&r1=985267&r2=985268&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TobagoDemoController.java (original)
+++ myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TobagoDemoController.java Fri Aug 13 16:30:41 2010
@@ -17,14 +17,12 @@ package org.apache.myfaces.tobago.exampl
  * limitations under the License.
  */
 
-import org.apache.myfaces.tobago.context.ResourceManagerUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.myfaces.tobago.component.Attributes;
 import org.apache.myfaces.tobago.component.CreateComponentUtils;
 import org.apache.myfaces.tobago.component.RendererTypes;
 import org.apache.myfaces.tobago.component.UIInput;
 import org.apache.myfaces.tobago.component.UIToolBar;
+import org.apache.myfaces.tobago.context.ResourceManagerUtils;
 import org.apache.myfaces.tobago.event.TabChangeListener;
 import org.apache.myfaces.tobago.example.data.CategoryTree;
 import org.apache.myfaces.tobago.example.data.Solar;
@@ -32,6 +30,8 @@ import org.apache.myfaces.tobago.example
 import org.apache.myfaces.tobago.model.SheetState;
 import org.apache.myfaces.tobago.model.TreeState;
 import org.apache.myfaces.tobago.util.ComponentUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import javax.faces.application.FacesMessage;
 import javax.faces.component.UIColumn;
@@ -124,16 +124,16 @@ public class TobagoDemoController {
   public TobagoDemoController() {
 
     String[] salutationKeys = {
-      "salutation_unknown",
-      "salutation_mr",
-      "salutation_mrs",
-      "salutation_family"
+        "salutation_unknown",
+        "salutation_mr",
+        "salutation_mrs",
+        "salutation_family"
     };
 
     salutationItems = getSelectItems(salutationKeys, "demo");
     this.salutation = new String[]{"", "", "", ""};
 
-    bool = new Boolean[] {true, false, true, false, true, false, true, false, true, false};
+    bool = new Boolean[]{true, false, true, false, true, false, true, false, true, false};
     boolTest = Boolean.TRUE;
 
     text = new String[11];
@@ -156,10 +156,6 @@ public class TobagoDemoController {
     solarArrayColumnLayout = "3*; 3*; 3*";
 
     tree = CategoryTree.createSample();
-    treeState = new TreeState();
-    treeState.addExpandState(tree);
-    treeState.addSelection((DefaultMutableTreeNode) tree.getChildAt(2).getChildAt(2));
-    treeState.setMarker((DefaultMutableTreeNode) tree.getChildAt(1));
     String[] values = {"none", "single", "singleLeafOnly", "multi", "multiLeafOnly"};
     selectionItems = getSelectItems(values, "demo");
     selectionType = (String) selectionItems[0].getValue();
@@ -401,14 +397,6 @@ public class TobagoDemoController {
     this.tree = tree;
   }
 
-  public TreeState getTreeState() {
-    return treeState;
-  }
-
-  public void setTreeState(TreeState treeState) {
-    this.treeState = treeState;
-  }
-
   public boolean isShowJunctions() {
     return showJunctions;
   }

Modified: myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TreeController.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TreeController.java?rev=985268&r1=985267&r2=985268&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TreeController.java (original)
+++ myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TreeController.java Fri Aug 13 16:30:41 2010
@@ -17,9 +17,9 @@ package org.apache.myfaces.tobago.exampl
  * limitations under the License.
  */
 
+import org.apache.myfaces.tobago.model.TreeState;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.myfaces.tobago.model.TreeState;
 
 import javax.faces.event.ActionEvent;
 import javax.swing.tree.DefaultMutableTreeNode;
@@ -68,12 +68,11 @@ public class TreeController {
       bulk.add(new DefaultMutableTreeNode(new Node("1.6." + (i + 1) + " Some Node")));
     }
     tree.add(bulk);
+    ((Node) tree.getUserObject()).setExpanded(true);
+    ((Node) temp.getUserObject()).setExpanded(true);
 
     // state
-
     state = new TreeState();
-    state.addExpandState(tree);
-    state.addExpandState(temp);
     state.addSelection(temp2);
     state.setMarker(music);
   }

Modified: myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/WEB-INF/faces-config.xml
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/WEB-INF/faces-config.xml?rev=985268&r1=985267&r2=985268&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/WEB-INF/faces-config.xml (original)
+++ myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/WEB-INF/faces-config.xml Fri Aug 13 16:30:41 2010
@@ -358,12 +358,6 @@
   </managed-bean>
 
   <managed-bean>
-    <managed-bean-name>treeCommandController</managed-bean-name>
-    <managed-bean-class>org.apache.myfaces.tobago.example.reference.TreeCommandController</managed-bean-class>
-    <managed-bean-scope>session</managed-bean-scope>
-  </managed-bean>
-
-  <managed-bean>
     <managed-bean-name>partialReloadController</managed-bean-name>
     <managed-bean-class>org.apache.myfaces.tobago.example.reference.PartialReloadController</managed-bean-class>
     <managed-bean-scope>request</managed-bean-scope>

Modified: myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/navigation.jsp
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/navigation.jsp?rev=985268&r1=985267&r2=985268&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/navigation.jsp (original)
+++ myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/navigation.jsp Fri Aug 13 16:30:41 2010
@@ -25,7 +25,7 @@
 
     <tc:treeMenu id="nav" state="#{navigation.state}">
       <tc:treeData value="#{navigation.tree}" var="node" id="data">
-        <tc:treeNode>
+        <tc:treeNode expanded="#{node.userObject.expanded}">
           <tc:treeCommand
               label="#{node.userObject.title}"
               action="#{node.userObject.action}"

Modified: myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/navigation.xhtml
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/navigation.xhtml?rev=985268&r1=985267&r2=985268&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/navigation.xhtml (original)
+++ myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/navigation.xhtml Fri Aug 13 16:30:41 2010
@@ -27,7 +27,7 @@
 
     <tc:treeMenu id="nav" state="#{navigation.state}">
       <tc:treeData value="#{navigation.tree}" var="node" id="data">
-        <tc:treeNode>
+        <tc:treeNode expanded="#{node.userObject.expanded}">
           <tc:treeCommand
               label="#{node.userObject.title}"
               action="#{node.userObject.action}"

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeIndentRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeIndentRenderer.java?rev=985268&r1=985267&r2=985268&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeIndentRenderer.java (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeIndentRenderer.java Fri Aug 13 16:30:41 2010
@@ -23,7 +23,6 @@ import org.apache.myfaces.tobago.compone
 import org.apache.myfaces.tobago.context.Markup;
 import org.apache.myfaces.tobago.context.ResourceManagerUtils;
 import org.apache.myfaces.tobago.internal.component.AbstractUITree;
-import org.apache.myfaces.tobago.internal.util.TreeUtils;
 import org.apache.myfaces.tobago.renderkit.LayoutComponentRendererBase;
 import org.apache.myfaces.tobago.renderkit.css.Classes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlAttributes;
@@ -44,7 +43,7 @@ public class TreeIndentRenderer extends 
 
     final UITreeIndent indent = (UITreeIndent) component;
     final UITreeNode node = ComponentUtils.findAncestor(indent, UITreeNode.class);
-    final AbstractUITree tree = node.findTree();
+    final AbstractUITree tree = ComponentUtils.findAncestor(indent, AbstractUITree.class);
 
     final boolean folder = node.isFolder();
     final int level = node.getLevel();
@@ -54,7 +53,7 @@ public class TreeIndentRenderer extends 
     final boolean showRoot = ((UITree) tree).isShowRoot(); //XXX
     final boolean showJunctions = indent.isShowJunctions();
     final boolean showRootJunction = ((UITree) tree).isShowRootJunction(); //XXX
-    final boolean expanded = TreeUtils.isExpanded(tree, node) || !showRoot && level == 0;
+    final boolean expanded = node.isExpanded() || !showRoot && level == 0;
 
     TobagoResponseWriter writer = HtmlRendererUtils.getTobagoResponseWriter(facesContext);
 

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeListboxNodeRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeListboxNodeRenderer.java?rev=985268&r1=985267&r2=985268&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeListboxNodeRenderer.java (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeListboxNodeRenderer.java Fri Aug 13 16:30:41 2010
@@ -20,12 +20,11 @@ package org.apache.myfaces.tobago.render
 import org.apache.commons.lang.StringUtils;
 import org.apache.myfaces.tobago.component.Attributes;
 import org.apache.myfaces.tobago.component.UITreeLabel;
-import org.apache.myfaces.tobago.component.UITreeListbox;
 import org.apache.myfaces.tobago.component.UITreeNode;
 import org.apache.myfaces.tobago.context.Markup;
+import org.apache.myfaces.tobago.event.TreeExpansionEvent;
 import org.apache.myfaces.tobago.internal.component.AbstractUITree;
 import org.apache.myfaces.tobago.internal.context.ResponseWriterDivider;
-import org.apache.myfaces.tobago.internal.util.TreeUtils;
 import org.apache.myfaces.tobago.layout.Display;
 import org.apache.myfaces.tobago.layout.Measure;
 import org.apache.myfaces.tobago.model.TreeSelectable;
@@ -63,7 +62,8 @@ public class TreeListboxNodeRenderer ext
       return;
     }
 
-    AbstractUITree tree = node.findTree();
+    AbstractUITree tree = ComponentUtils.findAncestor(node, AbstractUITree.class);
+    ;
     String treeId = tree.getClientId(facesContext);
     String nodeStateId = node.nodeStateId(facesContext);
     Map requestParameterMap = facesContext.getExternalContext().getRequestParameterMap();
@@ -71,7 +71,9 @@ public class TreeListboxNodeRenderer ext
 
     // expand state
     boolean expanded = Boolean.parseBoolean((String) requestParameterMap.get(id + "-expanded"));
-    TreeUtils.setExpanded(tree, node, expanded);
+    if (node.isExpanded() != expanded) {
+      new TreeExpansionEvent(node, node.isExpanded(), expanded).queue();
+    }
 
     // select
     String searchString;
@@ -96,7 +98,7 @@ public class TreeListboxNodeRenderer ext
 
   @Override
   public void prepareRender(FacesContext facesContext, UIComponent component) throws IOException {
-    super.prepareRender(facesContext,        component);
+    super.prepareRender(facesContext, component);
 
     final UITreeNode node = (UITreeNode) component;
     if (node.isMarked()) {
@@ -107,13 +109,13 @@ public class TreeListboxNodeRenderer ext
   @Override
   public void encodeBegin(FacesContext facesContext, UIComponent component) throws IOException {
     UITreeNode node = (UITreeNode) component;
-    AbstractUITree tree = node.findTree();
+    AbstractUITree tree = ComponentUtils.findAncestor(node, AbstractUITree.class);
     TobagoResponseWriter writer = HtmlRendererUtils.getTobagoResponseWriter(facesContext);
 
     boolean folder = node.isFolder();
     int level = node.getLevel();
     String id = node.getClientId(facesContext);
-    boolean expanded = TreeUtils.isExpanded(tree, node);
+    boolean expanded = node.isExpanded();
 
     if (level > 0) { // root will not rendered as an option
       writer.startElement(HtmlElements.OPTION, null);
@@ -129,13 +131,13 @@ public class TreeListboxNodeRenderer ext
     }
 
     if (folder) {
-      boolean siblingMode = "siblingLeafOnly".equals(((UITreeListbox) tree).getAttributes().get(Attributes.SELECTABLE));
+      boolean siblingMode = "siblingLeafOnly".equals(tree.getAttributes().get(Attributes.SELECTABLE));
       ResponseWriterDivider divider = ResponseWriterDivider.getInstance(facesContext, TreeListboxRenderer.DIVIDER);
       boolean alreadyExists = divider.activateBranch(facesContext);
       writer = HtmlRendererUtils.getTobagoResponseWriter(facesContext);
       if (!alreadyExists) {
         writer.startElement(HtmlElements.DIV, null);
-        writer.writeClassAttribute(Classes.create((UITreeListbox) tree, "level"));
+        writer.writeClassAttribute(Classes.create(tree, "level"));
         Style levelStyle = new Style();
         levelStyle.setLeft(Measure.valueOf(level * 160)); // xxx 160 should be configurable
         writer.writeStyleAttribute(levelStyle);
@@ -145,14 +147,14 @@ public class TreeListboxNodeRenderer ext
           writer.startElement(HtmlElements.SELECT, null);
           writer.writeAttribute(HtmlAttributes.DISABLED, true);
           writer.writeAttribute(HtmlAttributes.SIZE, 2); // must be > 1, but the size comes from the layout
-          writer.writeClassAttribute(Classes.create((UITreeListbox) tree, "select"));
+          writer.writeClassAttribute(Classes.create(tree, "select"));
           writer.endElement(HtmlElements.SELECT);
         }
       }
 
       writer.startElement(HtmlElements.SELECT, node);
       writer.writeIdAttribute(id + ComponentUtils.SUB_SEPARATOR + "select");
-      writer.writeClassAttribute(Classes.create((UITreeListbox) tree, "select"));
+      writer.writeClassAttribute(Classes.create(tree, "select"));
       if (!expanded) {
         Style selectStyle = new Style();
         selectStyle.setDisplay(Display.NONE);

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeMenuNodeRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeMenuNodeRenderer.java?rev=985268&r1=985267&r2=985268&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeMenuNodeRenderer.java (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeMenuNodeRenderer.java Fri Aug 13 16:30:41 2010
@@ -22,9 +22,8 @@ import org.apache.myfaces.tobago.compone
 import org.apache.myfaces.tobago.context.Markup;
 import org.apache.myfaces.tobago.context.ResourceManagerUtils;
 import org.apache.myfaces.tobago.context.UserAgent;
+import org.apache.myfaces.tobago.event.TreeExpansionEvent;
 import org.apache.myfaces.tobago.internal.component.AbstractUITree;
-import org.apache.myfaces.tobago.internal.component.AbstractUITreeNode;
-import org.apache.myfaces.tobago.internal.util.TreeUtils;
 import org.apache.myfaces.tobago.layout.Display;
 import org.apache.myfaces.tobago.renderkit.LayoutComponentRendererBase;
 import org.apache.myfaces.tobago.renderkit.css.Classes;
@@ -52,7 +51,7 @@ public class TreeMenuNodeRenderer extend
   @Override
   public void decode(FacesContext facesContext, UIComponent component) {
 
-    AbstractUITreeNode node = (AbstractUITreeNode) component;
+    UITreeNode node = (UITreeNode) component;
 
     super.decode(facesContext, node);
 
@@ -60,7 +59,7 @@ public class TreeMenuNodeRenderer extend
       return;
     }
 
-    AbstractUITree tree = node.findTree();
+    UITreeMenu tree = ComponentUtils.findAncestor(node, UITreeMenu.class);
     String treeId = tree.getClientId(facesContext);
     String nodeStateId = node.nodeStateId(facesContext);
     Map<String, String> requestParameterMap = facesContext.getExternalContext().getRequestParameterMap();
@@ -68,7 +67,9 @@ public class TreeMenuNodeRenderer extend
 
     // expand state
     boolean expanded = Boolean.parseBoolean(requestParameterMap.get(id + ComponentUtils.SUB_SEPARATOR + "expanded"));
-    TreeUtils.setExpanded(tree, node, expanded);
+    if (node.isExpanded() != expanded) {
+      new TreeExpansionEvent(node, node.isExpanded(), expanded).queue();
+    }
 
     // marker
     String marked = requestParameterMap.get(treeId + AbstractUITree.MARKED);
@@ -101,7 +102,7 @@ public class TreeMenuNodeRenderer extend
     final String id = node.getClientId(facesContext);
     final int level = node.getLevel();
     final boolean root = level == 0;
-    final boolean expanded = TreeUtils.isExpanded(tree, node) || level == 0;
+    final boolean expanded = node.isExpanded() || level == 0;
     final boolean showRoot = tree.isShowRoot();
     final boolean ie6
         = VariableResolverUtils.resolveClientProperties(facesContext).getUserAgent().equals(UserAgent.MSIE_6_0);
@@ -148,7 +149,7 @@ public class TreeMenuNodeRenderer extend
   }
 
   private void encodeExpandedHidden(
-      TobagoResponseWriter writer, AbstractUITreeNode node, String clientId, boolean expanded) throws IOException {
+      TobagoResponseWriter writer, UITreeNode node, String clientId, boolean expanded) throws IOException {
     writer.startElement(HtmlElements.INPUT, node);
     writer.writeAttribute(HtmlAttributes.TYPE, "hidden", false);
     writer.writeClassAttribute(Classes.create(node, "expanded", Markup.NULL));

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeNodeRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeNodeRenderer.java?rev=985268&r1=985267&r2=985268&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeNodeRenderer.java (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/TreeNodeRenderer.java Fri Aug 13 16:30:41 2010
@@ -23,11 +23,12 @@ import org.apache.myfaces.tobago.compone
 import org.apache.myfaces.tobago.component.UITreeNode;
 import org.apache.myfaces.tobago.context.Markup;
 import org.apache.myfaces.tobago.context.ResourceUtils;
+import org.apache.myfaces.tobago.event.TreeExpansionEvent;
 import org.apache.myfaces.tobago.internal.component.AbstractUITree;
 import org.apache.myfaces.tobago.internal.component.AbstractUITreeNode;
-import org.apache.myfaces.tobago.internal.util.TreeUtils;
+import org.apache.myfaces.tobago.layout.Display;
 import org.apache.myfaces.tobago.model.TreeSelectable;
-import org.apache.myfaces.tobago.renderkit.CommandRendererBase;
+import org.apache.myfaces.tobago.renderkit.LayoutComponentRendererBase;
 import org.apache.myfaces.tobago.renderkit.css.Classes;
 import org.apache.myfaces.tobago.renderkit.css.Style;
 import org.apache.myfaces.tobago.renderkit.html.HtmlAttributes;
@@ -46,7 +47,7 @@ import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
-public class TreeNodeRenderer extends CommandRendererBase {
+public class TreeNodeRenderer extends LayoutComponentRendererBase {
 
   private static final Logger LOG = LoggerFactory.getLogger(TreeNodeRenderer.class);
 
@@ -68,16 +69,17 @@ public class TreeNodeRenderer extends Co
       return;
     }
 
-    AbstractUITree tree = node.findTree();
+    AbstractUITree tree = ComponentUtils.findAncestor(node, AbstractUITree.class);
     String treeId = tree.getClientId(facesContext);
     String nodeStateId = node.nodeStateId(facesContext);
-    Map requestParameterMap = facesContext.getExternalContext().getRequestParameterMap();
+    Map<String, String> requestParameterMap = facesContext.getExternalContext().getRequestParameterMap();
     String id = node.getClientId(facesContext);
 
     // expand state
-    boolean expanded
-        = Boolean.parseBoolean((String) requestParameterMap.get(id + ComponentUtils.SUB_SEPARATOR + "expanded"));
-    TreeUtils.setExpanded(tree, node, expanded);
+    boolean expanded = Boolean.parseBoolean(requestParameterMap.get(id + ComponentUtils.SUB_SEPARATOR + "expanded"));
+    if (node.isExpanded() != expanded) {
+      new TreeExpansionEvent(node, node.isExpanded(), expanded).queue();
+    }
 
     // select
     String searchString;
@@ -113,19 +115,17 @@ public class TreeNodeRenderer extends Co
   @Override
   public void encodeBegin(FacesContext facesContext, UIComponent component) throws IOException {
     UITreeNode node = (UITreeNode) component;
-    AbstractUITree tree = node.findTree();
+    AbstractUITree tree = ComponentUtils.findAncestor(node, AbstractUITree.class);
 
-    final String treeId = tree.getClientId(facesContext);
     final boolean folder = node.isFolder();
     final boolean marked = node.isMarked();
     final String id = node.getClientId(facesContext);
     final int level = node.getLevel();
     final boolean root = level == 0;
-    final boolean hasNextSibling = node.isHasNextSibling();
     final List<Boolean> junctions = node.getJunctions();
     final boolean showRoot = ((UITree) tree).isShowRoot();
     // if the root is hidden, the root node must be expanded (otherwise you will see nothing)
-    final boolean expanded = TreeUtils.isExpanded(tree, node) || !showRoot && root;
+    final boolean expanded = node.isExpanded() || !showRoot && root;
 
     if (!showRoot && junctions.size() > 0) {
       junctions.remove(0);
@@ -171,10 +171,11 @@ public class TreeNodeRenderer extends Co
     }
 
     if (folder) {
-      String contentStyle = "display: " + (expanded ? "block" : "none") + ";";
       writer.startElement(HtmlElements.DIV, null);
       writer.writeIdAttribute(id + ComponentUtils.SUB_SEPARATOR + "content");
-      writer.writeStyleAttribute(contentStyle);
+      Style style = new Style();
+      style.setDisplay(expanded ? Display.BLOCK : Display.NONE);
+      writer.writeStyleAttribute(style);
     }
   }
 
@@ -191,12 +192,8 @@ public class TreeNodeRenderer extends Co
   @Override
   public void encodeEnd(FacesContext facesContext, UIComponent component) throws IOException {
     UITreeNode node = (UITreeNode) component;
-
-    boolean folder = node.isFolder();
-    String id = node.getClientId(facesContext);
-
     TobagoResponseWriter writer = HtmlRendererUtils.getTobagoResponseWriter(facesContext);
-
+    boolean folder = node.isFolder();
     if (folder) {
       writer.endElement(HtmlElements.DIV);
     }