Author: nbelaevski
Date: 2010-11-29 15:58:34 -0500 (Mon, 29 Nov 2010)
New Revision: 20217
Added:
trunk/ui/iteration/api/src/main/java/org/richfaces/model/DeclarativeTreeDataModelTuple.java
trunk/ui/iteration/api/src/main/java/org/richfaces/model/DeclarativeTreeModel.java
Modified:
trunk/examples/iteration-demo/src/main/webapp/treeModel.xhtml
trunk/ui/common/ui/src/main/java/org/richfaces/component/UIDataAdaptor.java
trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModel.java
trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModelTuple.java
trunk/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTree.java
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/DeclarativeTreeDataModelImpl.java
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/SwingTreeNodeDataModelImpl.java
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/TreeSequenceKeyModel.java
trunk/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeEncoderBase.java
Log:
https://jira.jboss.org/browse/RF-9680
Modified: trunk/examples/iteration-demo/src/main/webapp/treeModel.xhtml
===================================================================
--- trunk/examples/iteration-demo/src/main/webapp/treeModel.xhtml 2010-11-29 20:52:25 UTC
(rev 20216)
+++ trunk/examples/iteration-demo/src/main/webapp/treeModel.xhtml 2010-11-29 20:58:34 UTC
(rev 20217)
@@ -59,7 +59,7 @@
</it:tree>
</h:form>
- <h:panelGroup style="position: absolute; bottom: 20px; left: 20px; right:
20px;">
+ <h:panelGroup style="margin-top: 20px;">
<hr />
This demo uses icons taken from <a
href="http://www.famfamfam.com/lab/icons/silk/">http://www.f...
</h:panelGroup>
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-29
20:52:25 UTC (rev 20216)
+++ trunk/ui/common/ui/src/main/java/org/richfaces/component/UIDataAdaptor.java 2010-11-29
20:58:34 UTC (rev 20217)
@@ -246,10 +246,6 @@
private Object rowKey = null;
- private boolean rowDataIsSet = false;
-
- private Object rowData;
-
private String clientId;
private Object originalVarValue;
@@ -371,20 +367,22 @@
return rowKey;
}
- private void setRowKeyAndData(FacesContext facesContext, Object rowKey, boolean
localRowDataAvailable, Object localRowData) {
+ /**
+ * Setup current row by key. Perform same functionality as
+ * {@link javax.faces.component.UIData#setRowIndex(int)}, but for key object - it may
be not only
+ * row number in sequence data, but, for example - path to current node in
+ * tree.
+ *
+ * @param faces -
+ * current FacesContext
+ * @param key new key value.
+ */
+ public void setRowKey(FacesContext facesContext, Object rowKey) {
this.saveChildState(facesContext);
this.rowKey = rowKey;
- if (localRowDataAvailable) {
- this.rowData = localRowData;
- this.rowDataIsSet = (rowKey != null);
- } else {
- this.rowData = null;
- this.rowDataIsSet = false;
-
- getExtendedDataModel().setRowKey(rowKey);
- }
+ getExtendedDataModel().setRowKey(rowKey);
this.clientId = null;
@@ -394,24 +392,6 @@
this.restoreChildState(facesContext);
}
-
- protected void setRowKeyAndData(FacesContext facesContext, Object rowKey, Object
localRowData) {
- setRowKeyAndData(facesContext, rowKey, true, localRowData);
- }
-
- /**
- * Setup current row by key. Perform same functionality as
- * {@link javax.faces.component.UIData#setRowIndex(int)}, but for key object - it may
be not only
- * row number in sequence data, but, for example - path to current node in
- * tree.
- *
- * @param faces -
- * current FacesContext
- * @param key new key value.
- */
- public void setRowKey(FacesContext facesContext, Object rowKey) {
- setRowKeyAndData(facesContext, rowKey, false, null);
- }
/**
* Save values of {@link EditableValueHolder} fields before change current
@@ -635,15 +615,11 @@
}
public Object getRowData() {
- if (rowDataIsSet) {
- return rowData;
- }
-
return getExtendedDataModel().getRowData();
}
public boolean isRowAvailable() {
- return rowDataIsSet || getExtendedDataModel().isRowAvailable();
+ return getExtendedDataModel().isRowAvailable();
}
/**
Copied:
trunk/ui/iteration/api/src/main/java/org/richfaces/model/DeclarativeTreeDataModelTuple.java
(from rev 20216,
trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModelTuple.java)
===================================================================
---
trunk/ui/iteration/api/src/main/java/org/richfaces/model/DeclarativeTreeDataModelTuple.java
(rev 0)
+++
trunk/ui/iteration/api/src/main/java/org/richfaces/model/DeclarativeTreeDataModelTuple.java 2010-11-29
20:58:34 UTC (rev 20217)
@@ -0,0 +1,50 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.model;
+
+import javax.faces.component.UIComponent;
+
+import com.google.common.base.Objects.ToStringHelper;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class DeclarativeTreeDataModelTuple extends TreeDataModelTuple {
+
+ private UIComponent component;
+
+ public DeclarativeTreeDataModelTuple(Object rowKey, Object data, UIComponent
component) {
+ super(rowKey, data);
+ this.component = component;
+ }
+
+ public UIComponent getComponent() {
+ return component;
+ }
+
+ @Override
+ protected ToStringHelper createToStringHelper() {
+ return super.createToStringHelper().add("component", component);
+ }
+
+}
Copied: trunk/ui/iteration/api/src/main/java/org/richfaces/model/DeclarativeTreeModel.java
(from rev 20216,
trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModel.java)
===================================================================
--- trunk/ui/iteration/api/src/main/java/org/richfaces/model/DeclarativeTreeModel.java
(rev 0)
+++
trunk/ui/iteration/api/src/main/java/org/richfaces/model/DeclarativeTreeModel.java 2010-11-29
20:58:34 UTC (rev 20217)
@@ -0,0 +1,34 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.model;
+
+import javax.faces.component.UIComponent;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public interface DeclarativeTreeModel<E> extends TreeDataModel<E> {
+
+ public UIComponent getCurrentComponent();
+
+}
Modified: trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModel.java
===================================================================
--- trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModel.java 2010-11-29
20:52:25 UTC (rev 20216)
+++ trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModel.java 2010-11-29
20:58:34 UTC (rev 20217)
@@ -48,5 +48,9 @@
public Object getWrappedData();
public void setWrappedData(Object data);
+
+ public TreeDataModelTuple createSnapshot();
+
+ public void restoreFromSnapshot(TreeDataModelTuple tuple);
}
Modified:
trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModelTuple.java
===================================================================
---
trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModelTuple.java 2010-11-29
20:52:25 UTC (rev 20216)
+++
trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModelTuple.java 2010-11-29
20:58:34 UTC (rev 20217)
@@ -47,13 +47,17 @@
public Object getData() {
return data;
}
-
- @Override
- public String toString() {
+
+ protected ToStringHelper createToStringHelper() {
ToStringHelper helper = Objects.toStringHelper(this);
helper.add("rowKey", rowKey);
helper.add("data", data);
-
- return helper.toString();
+
+ return helper;
}
+
+ @Override
+ public String toString() {
+ return createToStringHelper().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-29
20:52:25 UTC (rev 20216)
+++
trunk/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTree.java 2010-11-29
20:58:34 UTC (rev 20217)
@@ -236,21 +236,13 @@
return converter;
}
- protected AbstractTreeNode findTreeNodeComponent(String nodeType, UIComponent
parentComponent) {
- Iterator<UIComponent> matchingNodes =
Iterators.filter(parentComponent.getChildren().iterator(),
- new MatchingTreeNodePredicate(nodeType));
-
- boolean hasNodes = matchingNodes.hasNext();
- if (hasNodes) {
- Iterator<UIComponent> renderedTreeNodes =
Iterators.filter(matchingNodes, ComponentPredicates.isRendered());
- if (renderedTreeNodes.hasNext()) {
- return (AbstractTreeNode) renderedTreeNodes.next();
- } else {
- return null;
- }
+ protected Iterator<UIComponent> findMatchingTreeNodeComponent(String nodeType,
UIComponent parentComponent) {
+ Iterator<UIComponent> children = parentComponent.getChildren().iterator();
+ if (parentComponent != this) {
+ children = Iterators.concat(children, this.getChildren().iterator());
}
- return null;
+ return Iterators.filter(children, new MatchingTreeNodePredicate(nodeType));
}
protected UIComponent getCurrentComponent() {
@@ -262,27 +254,22 @@
return this;
}
- @Override
- public void setRowKeyAndData(FacesContext facesContext, Object rowKey, Object
localRowData) {
- super.setRowKeyAndData(facesContext, rowKey, localRowData);
- }
-
public AbstractTreeNode findTreeNodeComponent() {
FacesContext facesContext = getFacesContext();
String nodeType = getNodeType();
- UIComponent component = getCurrentComponent();
+ Iterator<UIComponent> nodesItr = findMatchingTreeNodeComponent(nodeType,
getCurrentComponent());
- AbstractTreeNode treeNodeComponent = findTreeNodeComponent(nodeType, component);
- if (treeNodeComponent == null && component != this) {
- treeNodeComponent = findTreeNodeComponent(nodeType, this);
+ if (nodesItr.hasNext()) {
+ Iterator<UIComponent> renderedNodesItr = Iterators.filter(nodesItr,
ComponentPredicates.isRendered());
+ if (renderedNodesItr.hasNext()) {
+ return (AbstractTreeNode) renderedNodesItr.next();
+ }
+
+ return null;
}
- if (treeNodeComponent != null) {
- return treeNodeComponent;
- }
-
if (Strings.isNullOrEmpty(nodeType)) {
if (getAttributes().put(DEFAULT_TREE_NODE_CREATED, Boolean.TRUE) != null) {
return null;
@@ -497,13 +484,9 @@
}
public void beforeChildrenVisit() {
- // TODO Auto-generated method stub
-
}
public void afterChildrenVisit() {
- // TODO Auto-generated method stub
-
}
});
@@ -555,7 +538,7 @@
while (childrenTuples.hasNext()) {
TreeDataModelTuple tuple = childrenTuples.next();
- setRowKeyAndData(context, tuple.getRowKey(), tuple.getData());
+ restoreFromSnapshot(context, tuple);
if (!getTreeRange().shouldProcessNode()) {
continue;
@@ -576,4 +559,14 @@
super.resetDataModel();
treeRange = null;
}
+
+ public TreeDataModelTuple createSnapshot() {
+ return getTreeDataModel().createSnapshot();
+ }
+
+ public void restoreFromSnapshot(FacesContext context, TreeDataModelTuple tuple) {
+ getTreeDataModel().restoreFromSnapshot(tuple);
+ setRowKey(context, tuple.getRowKey());
+ }
+
}
Modified:
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/DeclarativeTreeDataModelImpl.java
===================================================================
---
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/DeclarativeTreeDataModelImpl.java 2010-11-29
20:52:25 UTC (rev 20216)
+++
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/DeclarativeTreeDataModelImpl.java 2010-11-29
20:58:34 UTC (rev 20217)
@@ -45,7 +45,7 @@
* @author Nick Belaevski
*
*/
-public class DeclarativeTreeDataModelImpl extends
TreeSequenceKeyModel<DeclarativeModelKey, Object> implements DeclarativeTreeModel {
+public class DeclarativeTreeDataModelImpl extends
TreeSequenceKeyModel<DeclarativeModelKey, Object> implements
DeclarativeTreeModel<Object> {
private static final Logger LOGGER = RichfacesLogger.MODEL.getLogger();
@@ -71,9 +71,8 @@
DeclarativeModelKey key = new DeclarativeModelKey(component.getId(),
counter++);
SequenceRowKey<DeclarativeModelKey> newKey = baseKey.append(key);
- setCurrentState(newKey, nextNode, component);
- return new TreeDataModelTuple(newKey, nextNode);
+ return new DeclarativeTreeDataModelTuple(newKey, nextNode, component);
}
public boolean hasNext() {
@@ -163,8 +162,7 @@
return currentComponent;
}
- protected void setCurrentState(SequenceRowKey<DeclarativeModelKey> key, Object
data, UIComponent currentComponent) {
- setRowKeyAndData(key, data);
+ protected void setCurrentComponent(UIComponent currentComponent) {
this.currentComponent = currentComponent;
}
@@ -180,9 +178,6 @@
return Iterables.contains(currentComponent.getChildren(),
Predicates.instanceOf(TreeModelAdaptor.class));
}
- /* (non-Javadoc)
- * @see org.richfaces.model.TreeDataModel#children()
- */
public Iterator<TreeDataModelTuple> children() {
return new DeclarativeModelCompositeIterator(currentComponent, safeGetRowKey());
}
@@ -255,11 +250,23 @@
}
Object data = Iterables.get((Iterable<?>) nodes, (Integer)
segment.getModelKey());
- setCurrentState(safeGetRowKey().append(segment), data, modelComponent);
-
+ setRowKeyAndData(safeGetRowKey().append(segment), data);
+ setCurrentComponent(modelComponent);
+
if (var != null) {
contextMap.put(var, data);
}
}
+
+ public TreeDataModelTuple createSnapshot() {
+ return new DeclarativeTreeDataModelTuple(getRowKey(), getData(),
getCurrentComponent());
+ }
+
+ public void restoreFromSnapshot(TreeDataModelTuple tuple) {
+ DeclarativeTreeDataModelTuple declarativeModelTuple =
(DeclarativeTreeDataModelTuple) tuple;
+
+ super.restoreFromSnapshot(declarativeModelTuple);
+ setCurrentComponent(declarativeModelTuple.getComponent());
+ }
}
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-29
20:52:25 UTC (rev 20216)
+++
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/SwingTreeNodeDataModelImpl.java 2010-11-29
20:58:34 UTC (rev 20217)
@@ -70,8 +70,6 @@
key = new SequenceRowKey<Integer>(getNextCounterValue());
}
- setRowKeyAndData(key, node);
-
return new TreeDataModelTuple(key, node);
}
@@ -190,5 +188,5 @@
//TODO - optimize - remove partial keys creation
setRowKeyAndData(safeGetRowKey().append(segment), child);
}
-
+
}
\ No newline at end of file
Modified:
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/TreeSequenceKeyModel.java
===================================================================
---
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/TreeSequenceKeyModel.java 2010-11-29
20:52:25 UTC (rev 20216)
+++
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/TreeSequenceKeyModel.java 2010-11-29
20:58:34 UTC (rev 20217)
@@ -138,4 +138,13 @@
public void setRowIndex(int rowIndex) {
throw new UnsupportedOperationException();
}
+
+ public TreeDataModelTuple createSnapshot() {
+ return new TreeDataModelTuple(getRowKey(), getData());
+ }
+
+ public void restoreFromSnapshot(TreeDataModelTuple tuple) {
+ setRowKeyAndData((SequenceRowKey<K>) tuple.getRowKey(), (V)
tuple.getData());
+ }
+
}
Modified:
trunk/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeEncoderBase.java
===================================================================
---
trunk/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeEncoderBase.java 2010-11-29
20:52:25 UTC (rev 20216)
+++
trunk/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeEncoderBase.java 2010-11-29
20:58:34 UTC (rev 20217)
@@ -24,6 +24,7 @@
import java.io.IOException;
import java.util.LinkedList;
+import javax.faces.FacesException;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
@@ -37,50 +38,41 @@
abstract class TreeEncoderBase implements TreeDataVisitor {
- /**
- * @author Nick Belaevski
- *
- */
private static final class QueuedData {
- private boolean encoded = false;
-
- private boolean visited = false;
+ private enum State {
+ initial, visited, encoded
+ }
- //TODO - should be part of tree state
- private boolean leaf;
+ private State state = State.initial;
private TreeDataModelTuple tuple;
- public QueuedData(TreeDataModelTuple tuple, boolean leaf) {
+ public QueuedData(TreeDataModelTuple tuple) {
super();
this.tuple = tuple;
- this.leaf = leaf;
}
public boolean isEncoded() {
- return encoded;
+ return state == State.encoded;
}
- public void setEncoded(boolean encoded) {
- this.encoded = encoded;
+ public void makeEncoded() {
+ this.state = State.encoded;
}
public void makeVisited() {
- this.visited = true;
+ this.state = State.visited;
}
public boolean isVisited() {
- return visited;
+ return state == State.visited;
}
public TreeDataModelTuple getTuple() {
return tuple;
}
- public boolean isLeaf() {
- return leaf;
- }
}
static final String TREE_NODE_STATE_ATTRIBUTE = "__treeNodeState";
@@ -111,10 +103,10 @@
QueuedData data = queuedDataList.getLast();
if (!data.isEncoded()) {
- data.setEncoded(true);
- tree.setRowKeyAndData(context, data.getTuple().getRowKey(),
data.getTuple().getData());
+ data.makeEncoded();
+ tree.restoreFromSnapshot(context, data.getTuple());
- TreeNodeState nodeState = getNodeState(data.isLeaf(), false);
+ TreeNodeState nodeState = getNodeState(tree.isLeaf(), false);
writeTreeNodeStartElement(nodeState);
tree.findTreeNodeComponent().encodeAll(context);
@@ -141,48 +133,36 @@
}
}
- /* (non-Javadoc)
- * @see org.richfaces.model.TreeDataVisitor#afterChildrenVisit()
- */
public void afterChildrenVisit() {
- // TODO Auto-generated method stub
-
}
public void enterNode() {
- TreeDataModelTuple tuple = new TreeDataModelTuple(tree.getRowKey(),
tree.getRowData());
- QueuedData queuedData = new QueuedData(tuple, tree.isLeaf());
+ TreeDataModelTuple tuple = tree.createSnapshot();
+ QueuedData queuedData = new QueuedData(tuple);
try {
flushParentNode();
} catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
+ throw new FacesException(e.getMessage(), e);
}
- tree.setRowKeyAndData(context, tuple.getRowKey(), tuple.getData());
+ tree.restoreFromSnapshot(context, tuple);
queuedDataList.add(queuedData);
}
public void exitNode() {
QueuedData data = queuedDataList.removeLast();
-
- tree.setRowKeyAndData(context, data.getTuple().getRowKey(),
data.getTuple().getData());
- if (!data.isEncoded()) {
- try {
- writeTreeNodeStartElement(getNodeState(data.isLeaf(),
data.isVisited()));
+
+ tree.restoreFromSnapshot(context, data.getTuple());
+ try {
+ if (!data.isEncoded()) {
+ writeTreeNodeStartElement(getNodeState(tree.isLeaf(),
data.isVisited()));
tree.findTreeNodeComponent().encodeAll(context);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
}
- }
- try {
writeTreeNodeEndElement();
} catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
+ throw new FacesException(e.getMessage(), e);
}
}