Author: nbelaevski
Date: 2010-11-18 11:15:48 -0500 (Thu, 18 Nov 2010)
New Revision: 20092
Modified:
trunk/examples/iteration-demo/src/main/webapp/WEB-INF/web.xml
trunk/examples/iteration-demo/src/main/webapp/tree.xhtml
trunk/ui/common/ui/src/main/java/org/richfaces/component/UIDataAdaptor.java
trunk/ui/iteration/api/src/main/java/org/richfaces/model/SwingTreeNodeImpl.java
trunk/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTree.java
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/ExtendedTreeDataModelImpl.java
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/SwingTreeNodeDataModelImpl.java
Log:
https://jira.jboss.org/browse/RF-9716
Modified: trunk/examples/iteration-demo/src/main/webapp/WEB-INF/web.xml
===================================================================
--- trunk/examples/iteration-demo/src/main/webapp/WEB-INF/web.xml 2010-11-18 16:10:17 UTC
(rev 20091)
+++ trunk/examples/iteration-demo/src/main/webapp/WEB-INF/web.xml 2010-11-18 16:15:48 UTC
(rev 20092)
@@ -72,6 +72,11 @@
<param-value>true</param-value>
</context-param>
+ <context-param>
+ <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
+ <param-value>true</param-value>
+ </context-param>
+
<context-param>
<description>
Set this flag to true if you want the JavaServer Faces
Modified: trunk/examples/iteration-demo/src/main/webapp/tree.xhtml
===================================================================
--- trunk/examples/iteration-demo/src/main/webapp/tree.xhtml 2010-11-18 16:10:17 UTC (rev
20091)
+++ trunk/examples/iteration-demo/src/main/webapp/tree.xhtml 2010-11-18 16:15:48 UTC (rev
20092)
@@ -83,6 +83,9 @@
</it:treeNode>
</it:tree>
+ <it:tree id="defaultNodeTree" var="node"
value="#{treeBean.rootNodes}"
+ selectionType="#{treeBean.selectionType}"
toggleType="#{treeBean.toggleType}">
+ </it:tree>
</h:form>
</h:body>
</html>
Modified: trunk/ui/common/ui/src/main/java/org/richfaces/component/UIDataAdaptor.java
===================================================================
--- trunk/ui/common/ui/src/main/java/org/richfaces/component/UIDataAdaptor.java 2010-11-18
16:10:17 UTC (rev 20091)
+++ trunk/ui/common/ui/src/main/java/org/richfaces/component/UIDataAdaptor.java 2010-11-18
16:15:48 UTC (rev 20092)
@@ -1489,7 +1489,7 @@
int separatorIndex = substring.indexOf(separatorChar);
if (separatorIndex < 0) {
- return substring;
+ return null;
} else {
return substring.substring(0, separatorIndex);
}
Modified: trunk/ui/iteration/api/src/main/java/org/richfaces/model/SwingTreeNodeImpl.java
===================================================================
---
trunk/ui/iteration/api/src/main/java/org/richfaces/model/SwingTreeNodeImpl.java 2010-11-18
16:10:17 UTC (rev 20091)
+++
trunk/ui/iteration/api/src/main/java/org/richfaces/model/SwingTreeNodeImpl.java 2010-11-18
16:15:48 UTC (rev 20092)
@@ -28,6 +28,8 @@
import javax.swing.tree.TreeNode;
+import com.google.common.base.Objects;
+import com.google.common.base.Objects.ToStringHelper;
import com.google.common.collect.Iterators;
/**
@@ -99,4 +101,12 @@
public List<TreeNode> getChildrenList() {
return children;
}
+
+ @Override
+ public String toString() {
+ ToStringHelper toStringHelper = Objects.toStringHelper(this);
+ toStringHelper.add("data", data);
+
+ return toStringHelper.toString();
+ }
}
Modified: trunk/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTree.java
===================================================================
---
trunk/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTree.java 2010-11-18
16:10:17 UTC (rev 20091)
+++
trunk/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTree.java 2010-11-18
16:15:48 UTC (rev 20092)
@@ -27,7 +27,9 @@
import java.util.Iterator;
import javax.el.ValueExpression;
+import javax.faces.application.Application;
import javax.faces.component.UIComponent;
+import javax.faces.component.html.HtmlOutputText;
import javax.faces.component.visit.VisitCallback;
import javax.faces.component.visit.VisitContext;
import javax.faces.component.visit.VisitResult;
@@ -49,12 +51,15 @@
import org.richfaces.convert.SequenceRowKeyConverter;
import org.richfaces.event.TreeSelectionEvent;
import org.richfaces.event.TreeSelectionListener;
+import org.richfaces.log.Logger;
+import org.richfaces.log.RichfacesLogger;
import org.richfaces.model.ExtendedTreeDataModelImpl;
import org.richfaces.model.SwingTreeNodeDataModelImpl;
import org.richfaces.model.TreeDataModel;
import org.richfaces.renderkit.MetaComponentRenderer;
import com.google.common.base.Predicate;
+import com.google.common.base.Strings;
import com.google.common.collect.Iterables;
import com.google.common.collect.Iterators;
@@ -76,6 +81,8 @@
public static final String SELECTION_META_COMPONENT_ID = "selection";
+ private static final String DEFAULT_TREE_NODE_CREATED = AbstractTree.class.getName()
+ ":DEFAULT_TREE_NODE_CREATED";
+
private static final class MatchingTreeNodePredicate implements
Predicate<UIComponent> {
private String type;
@@ -193,17 +200,36 @@
}
public AbstractTreeNode findTreeNodeComponent() {
- if (getChildCount() == 0) {
- return null;
- }
-
+ FacesContext facesContext = getFacesContext();
+
+ String nodeType = getNodeType();
Iterator<UIComponent> iterator = Iterators.filter(getChildren().iterator(),
- new MatchingTreeNodePredicate(getNodeType()));
+ new MatchingTreeNodePredicate(nodeType));
if (iterator.hasNext()) {
return (AbstractTreeNode) iterator.next();
}
+ if (Strings.isNullOrEmpty(nodeType)) {
+ //make PSS happy
+ if (getAttributes().put(DEFAULT_TREE_NODE_CREATED, Boolean.TRUE) != null) {
+ return null;
+ }
+
+ Application application = facesContext.getApplication();
+ AbstractTreeNode treeNode = (AbstractTreeNode)
application.createComponent(AbstractTreeNode.COMPONENT_TYPE);
+ treeNode.setId("__defaultTreeNode");
+
+ getChildren().add(treeNode);
+
+ UIComponent text =
application.createComponent(HtmlOutputText.COMPONENT_TYPE);
+ text.setValueExpression("value",
application.getExpressionFactory().createValueExpression(facesContext.getELContext(),
+ "#{" + getVar() + "}", String.class));
+ treeNode.getChildren().add(text);
+
+ return treeNode;
+ }
+
return null;
}
Modified:
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/ExtendedTreeDataModelImpl.java
===================================================================
---
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/ExtendedTreeDataModelImpl.java 2010-11-18
16:10:17 UTC (rev 20091)
+++
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/ExtendedTreeDataModelImpl.java 2010-11-18
16:15:48 UTC (rev 20092)
@@ -88,8 +88,12 @@
public void walk(FacesContext context, DataVisitor visitor, Range range, Object
argument) {
TreeRange treeRange = (TreeRange) range;
if (treeRange.shouldIterateChildren(null)) {
- Iterator<Object> iterator = getChildrenRowKeysIterator(null);
- walk(context, visitor, range, argument, iterator);
+ setRowKey(null);
+ DataVisitResult visitResult = visitor.process(context, null, argument);
+ if (visitResult == DataVisitResult.CONTINUE) {
+ Iterator<Object> iterator = getChildrenRowKeysIterator(null);
+ walk(context, visitor, range, argument, iterator);
+ }
}
}
Modified:
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/SwingTreeNodeDataModelImpl.java
===================================================================
---
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/SwingTreeNodeDataModelImpl.java 2010-11-18
16:10:17 UTC (rev 20091)
+++
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/SwingTreeNodeDataModelImpl.java 2010-11-18
16:15:48 UTC (rev 20092)
@@ -166,7 +166,7 @@
}
public boolean isDataAvailable() {
- return selectedNode != null;
+ return selectedRowKey == null || selectedNode != null;
}
public Object getWrappedData() {