Author: nbelaevski
Date: 2007-06-26 12:14:55 -0400 (Tue, 26 Jun 2007)
New Revision: 1327
Removed:
trunk/richfaces/tree/src/main/java/org/richfaces/component/preserve/TreeDataBatchLocator.java
trunk/richfaces/tree/src/main/java/org/richfaces/component/preserve/TreeDataLocator.java
trunk/richfaces/tree/src/main/java/org/richfaces/component/preserve/TreeNodeInfo.java
Modified:
trunk/richfaces/tree/src/main/java/org/richfaces/component/AbstractTreeDataModel.java
trunk/richfaces/tree/src/main/java/org/richfaces/component/CacheableTreeDataModel.java
trunk/richfaces/tree/src/main/java/org/richfaces/component/TreeDataModel.java
trunk/richfaces/tree/src/main/java/org/richfaces/component/UITree.java
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/TreeState.java
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/CollapseAllCommandEvent.java
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/CollapseNodeCommandEvent.java
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/ExpandAllCommandEvent.java
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/ExpandNodeCommandEvent.java
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/TreeStateCommandsListener.java
trunk/richfaces/tree/src/main/java/org/richfaces/renderkit/TreeDataModelEventNavigator.java
trunk/richfaces/tree/src/main/java/org/richfaces/renderkit/TreeRendererBase.java
trunk/richfaces/tree/src/test/java/org/richfaces/component/state/events/MockTreeStateCommandsListener.java
Log:
- Tree refactored to use more generic parameters
- Handling for UITreeNode "rendered" attribute added
Modified:
trunk/richfaces/tree/src/main/java/org/richfaces/component/AbstractTreeDataModel.java
===================================================================
---
trunk/richfaces/tree/src/main/java/org/richfaces/component/AbstractTreeDataModel.java 2007-06-26
16:13:22 UTC (rev 1326)
+++
trunk/richfaces/tree/src/main/java/org/richfaces/component/AbstractTreeDataModel.java 2007-06-26
16:14:55 UTC (rev 1327)
@@ -81,7 +81,7 @@
* @see {@link ExtendedDataModel#walk(FacesContext, DataVisitor, Range, Object)}
*/
public abstract void walk(FacesContext context, DataVisitor dataVisitor,
- Range range, TreeRowKey rowKey, Object argument, boolean last) throws IOException;
+ Range range, Object rowKey, Object argument, boolean last) throws IOException;
/**
* returns whether this node is leaf
@@ -91,17 +91,17 @@
/**
* Walk backing sub-model having row key argument as its root. If there is no backing
model
- * configured, calling this method is equivalent to calling {@link #walk(FacesContext,
DataVisitor, Range, TreeRowKey, Object, boolean)}
+ * configured, calling this method is equivalent to calling {@link #walk(FacesContext,
DataVisitor, Range, Object, Object, boolean)}
* @param facesContext faces context
* @param visitor {@link UIDataAdaptor.ComponentVisitor} instance
- * @param range {@link TreeRange} to constraint the walk
+ * @param range {@link Range} to constraint the walk
* @param key row key to treat as root of sub-model
* @param argument implementation-specific argument
* @throws IOException
*
* @see {@link #walk(FacesContext, DataVisitor, Range, TreeRowKey, Object, boolean)}
*/
- public abstract void walkModel(FacesContext facesContext, DataVisitor visitor, TreeRange
range, TreeRowKey key, Object argument, boolean last) throws IOException;
+ public abstract void walkModel(FacesContext facesContext, DataVisitor visitor, Range
range, Object key, Object argument, boolean last) throws IOException;
/**
* Processes concrete tree node. Knows about {@link LastElementAware} interface and
handles it
Modified:
trunk/richfaces/tree/src/main/java/org/richfaces/component/CacheableTreeDataModel.java
===================================================================
---
trunk/richfaces/tree/src/main/java/org/richfaces/component/CacheableTreeDataModel.java 2007-06-26
16:13:22 UTC (rev 1326)
+++
trunk/richfaces/tree/src/main/java/org/richfaces/component/CacheableTreeDataModel.java 2007-06-26
16:14:55 UTC (rev 1327)
@@ -22,20 +22,17 @@
package org.richfaces.component;
import java.io.IOException;
-import java.util.Iterator;
-import javax.faces.component.StateHolder;
import javax.faces.context.FacesContext;
import org.ajax4jsf.ajax.repeat.DataVisitor;
import org.ajax4jsf.ajax.repeat.Range;
-import org.richfaces.component.state.TreeRange;
/**
* @author Nick - mailto:nbelaevski@exadel.com created 08.01.2007
*
*/
-public class CacheableTreeDataModel extends TreeDataModel implements StateHolder{
+public class CacheableTreeDataModel extends TreeDataModel {
private final class Visitor implements DataVisitor, LastElementAware {
private final DataVisitor visitor;
@@ -94,7 +91,7 @@
}
public void walkModel(FacesContext context, DataVisitor visitor,
- TreeRange range, TreeRowKey key, Object argument, boolean last)
+ Range range, Object key, Object argument, boolean last)
throws IOException {
treeDataModel.walkModel(context, new Visitor(visitor), range, key,
argument, last);
@@ -109,11 +106,11 @@
}
public void walk(FacesContext context, final DataVisitor dataVisitor,
- Range range, TreeRowKey rowKey, Object argument, boolean last)
+ Range range, Object rowKey, Object argument, boolean last)
throws IOException {
- TreeNode cachedTreeNode = locateTreeNode(rowKey);
- TreeNode treeNode = treeDataModel.locateTreeNode(rowKey);
+ TreeNode cachedTreeNode = locateTreeNode((TreeRowKey) rowKey);
+ TreeNode treeNode = treeDataModel.locateTreeNode((TreeRowKey) rowKey);
if (treeNode != null) {
if (cachedTreeNode == null || (cachedTreeNode.isLeaf() && !treeNode.isLeaf()))
{
@@ -124,7 +121,6 @@
super.walk(context, dataVisitor, range, rowKey, argument, last);
}
}
-
}
public void setRowData(Object object) {
@@ -132,32 +128,13 @@
}
public boolean isTransient() {
- return false;
+ return true;
}
- public void restoreState(FacesContext context, Object state) {
- Object[] _state = (Object[]) state;
- setWrappedData(_state[0]);
- }
-
- public Object saveState(FacesContext context) {
- Object[] state = new Object[1];
- state[0] = getWrappedData();
- return state;
- }
-
public void setTransient(boolean newTransientValue) {
- if (newTransientValue) {
+ if (!newTransientValue) {
throw new IllegalArgumentException(
"ReplaceableTreeDataModel shouldn't be transient!");
}
}
-
- public void resetSub(TreeRowKey key) {
- TreeNode node = locateTreeNode(key);
- for (Iterator iterator = node.getChildren(); iterator.hasNext();) {
- iterator.next();
- iterator.remove();
- }
- }
}
Modified: trunk/richfaces/tree/src/main/java/org/richfaces/component/TreeDataModel.java
===================================================================
---
trunk/richfaces/tree/src/main/java/org/richfaces/component/TreeDataModel.java 2007-06-26
16:13:22 UTC (rev 1326)
+++
trunk/richfaces/tree/src/main/java/org/richfaces/component/TreeDataModel.java 2007-06-26
16:14:55 UTC (rev 1327)
@@ -59,7 +59,7 @@
public void walk(FacesContext context, DataVisitor dataVisitor,
- Range range, TreeRowKey rowKey, Object argument, boolean last) throws IOException {
+ Range range, Object rowKey, Object argument, boolean last) throws IOException {
ListRowKey listRowKey = (ListRowKey) rowKey;
@@ -68,13 +68,13 @@
if (node != null) {
TreeRange treeRange = (TreeRange) range;
- if (treeRange == null || treeRange.processNode(rowKey)) {
+ if (treeRange == null || treeRange.processNode(listRowKey)) {
if (node.getParent() != null) {
- processElement(context, dataVisitor, argument, rowKey, last);
+ processElement(context, dataVisitor, argument, listRowKey, last);
}
- if (treeRange == null || treeRange.processChildren(rowKey)) {
+ if (treeRange == null || treeRange.processChildren(listRowKey)) {
if (!node.isLeaf()) {
Iterator children = node.getChildren();
@@ -213,7 +213,7 @@
"No tree element available or row key not set!");
}
- public void walkModel(FacesContext context, DataVisitor visitor, TreeRange range,
TreeRowKey key, Object argument, boolean last) throws IOException {
+ public void walkModel(FacesContext context, DataVisitor visitor, Range range, Object
key, Object argument, boolean last) throws IOException {
walk(context, visitor, range, key, argument, last);
}
Modified: trunk/richfaces/tree/src/main/java/org/richfaces/component/UITree.java
===================================================================
--- trunk/richfaces/tree/src/main/java/org/richfaces/component/UITree.java 2007-06-26
16:13:22 UTC (rev 1326)
+++ trunk/richfaces/tree/src/main/java/org/richfaces/component/UITree.java 2007-06-26
16:14:55 UTC (rev 1327)
@@ -24,7 +24,6 @@
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
-import java.util.Set;
import javax.faces.application.Application;
import javax.faces.component.NamingContainer;
@@ -39,6 +38,7 @@
import org.ajax4jsf.ajax.repeat.DataComponentState;
import org.ajax4jsf.ajax.repeat.DataVisitor;
import org.ajax4jsf.ajax.repeat.ExtendedDataModel;
+import org.ajax4jsf.ajax.repeat.Range;
import org.ajax4jsf.ajax.repeat.UIDataAdaptor;
import org.ajax4jsf.dnd.Draggable;
import org.ajax4jsf.dnd.Dropzone;
@@ -93,8 +93,6 @@
public static final String SELECTION_INPUT_ATTRIBUTE = "_selectionInput";
- public final static String TREE_DATA_LOCATOR_BINDING = "treeDataLocator";
-
public final static String DEFAULT_SELECTED_CSS_CLASS = "dr-tree-i-sel";
public final static String DEFAULT_HIGHLIGHTED_CSS_CLASS = "dr-tree-i-hl";
@@ -238,28 +236,12 @@
super.resetDataModel();
TreeState state = (TreeState) getComponentState();
-
- CacheableTreeDataModel cacheableModel = state.getTreeDataModel();
- if (cacheableModel != null) {
- if (cacheableModel.isTransient()) {
- state.setTreeDataModel(null);
- setExtendedDataModel(createDataModel(false));
- } else {
- Set ajaxKeys = getAjaxKeys();
- for (Iterator iterator = ajaxKeys.iterator(); iterator
- .hasNext();) {
- TreeRowKey treeRowKey = (TreeRowKey) iterator.next();
-
- cacheableModel.resetSub(treeRowKey);
- }
- }
- }
-
-
// transfer nodes delayed to open to rendering queue
state.transferQueuedNodes();
// re-set stopInCollapsed to handle AJAX switch type change
state.setStopInCollapsed(isStopInCollapsed());
+
+ setExtendedDataModel(createDataModel(false));
}
public void walk(FacesContext faces, DataVisitor visitor)
@@ -275,21 +257,23 @@
* {@link FacesContext} instance
* @param visitor
* {@link UIDataAdaptor.ComponentVisitor} instance
+ * @param range
+ * {@link Range} range instance
* @param rowKey
- * {@link TreeRowKey} instance to start from or null to start
+ * row key to start from or null to start
* from root
* @param argument
* implementation-specific visitor argument
* @throws IOException
*/
- public void walk(FacesContext faces, DataVisitor visitor,
- TreeRowKey rowKey, Object argument) throws IOException {
+ public void walk(FacesContext faces, DataVisitor visitor, Range range,
+ Object rowKey, Object argument) throws IOException {
Object savedRowKey = getRowKey();
try {
AbstractTreeDataModel dataModel = (AbstractTreeDataModel) getExtendedDataModel();
- dataModel.walk(faces, visitor, getComponentState().getRange(), rowKey,
+ dataModel.walk(faces, visitor, range, rowKey,
argument,
faces.getExternalContext().getRequestParameterMap().get(
getBaseClientId(faces) + LAST_ELEMENT_FLAG) != null);
@@ -307,18 +291,20 @@
* {@link FacesContext} instance
* @param visitor
* {@link UIDataAdaptor.ComponentVisitor} instance
+ * @param range
+ * {@link Range} range instance
* @param rowKey
- * {@link TreeRowKey} instance to start from or null to start
+ * row key to start from or null to start
* from root
* @param argument
* implementation-specific visitor argument
* @throws IOException
*/
- public void walkModel(FacesContext faces, DataVisitor visitor,
- TreeRowKey key, Object argument) throws IOException {
+ public void walkModel(FacesContext faces, DataVisitor visitor, Range range,
+ Object key, Object argument) throws IOException {
AbstractTreeDataModel extendedDataModel = (AbstractTreeDataModel)
getExtendedDataModel();
extendedDataModel.walkModel(faces, visitor,
- (TreeRange) getComponentState().getRange(), key, argument,
+ (TreeRange) range, key, argument,
faces.getExternalContext().getRequestParameterMap().get(
getBaseClientId(faces) + LAST_ELEMENT_FLAG) != null);
}
@@ -420,7 +406,7 @@
protected DataComponentState createComponentState() {
- return new TreeState(this, isStopInCollapsed());
+ return new TreeState(isStopInCollapsed());
}
/**
@@ -459,33 +445,24 @@
return isAjaxSubmitSelection();
}
- private ExtendedDataModel createDataModel(boolean allowTransientModel) {
- TreeState state = ((TreeState) getComponentState());
- CacheableTreeDataModel stateModel = state.getTreeDataModel();
-
+ private ExtendedDataModel createDataModel(boolean allowCached) {
TreeDataModel treeDataModel = new TreeDataModel();
treeDataModel.setWrappedData(this.getValue());
+
+ if (allowCached && PRESERVE_MODEL_REQUEST.equals(getPreserveModel())) {
+ treeDataModel = new CacheableTreeDataModel(treeDataModel);
+ }
- if (stateModel == null) {
- String preserveModel = getPreserveModel();
- if (allowTransientModel && PRESERVE_MODEL_REQUEST.equals(preserveModel)) {
- stateModel = new CacheableTreeRequestDataModel(treeDataModel);
- state.setTreeDataModel(stateModel);
- } else if (PRESERVE_MODEL_STATE.equals(preserveModel)) {
- stateModel = new CacheableTreeDataModel(treeDataModel);
- state.setTreeDataModel(stateModel);
- } else {
- return treeDataModel;
- }
- } else {
- //bind existing model to the state-saved model
- stateModel.setTreeDataModel(treeDataModel);
+ return treeDataModel;
+ }
+
+ public void processUpdates(FacesContext faces) {
+ super.processUpdates(faces);
+ if (getExtendedDataModel() instanceof CacheableTreeDataModel) {
+ setExtendedDataModel(createDataModel(false));
}
-
- return stateModel;
}
-
protected ExtendedDataModel createDataModel() {
return createDataModel(true);
}
Deleted:
trunk/richfaces/tree/src/main/java/org/richfaces/component/preserve/TreeDataBatchLocator.java
===================================================================
---
trunk/richfaces/tree/src/main/java/org/richfaces/component/preserve/TreeDataBatchLocator.java 2007-06-26
16:13:22 UTC (rev 1326)
+++
trunk/richfaces/tree/src/main/java/org/richfaces/component/preserve/TreeDataBatchLocator.java 2007-06-26
16:14:55 UTC (rev 1327)
@@ -1,34 +0,0 @@
-/**
- * License Agreement.
- *
- * JBoss RichFaces 3.0 - Ajax4jsf Component Library
- *
- * Copyright (C) 2007 Exadel, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1 as published by the Free Software Foundation.
- *
- * This library 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 library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-package org.richfaces.component.preserve;
-
-import org.richfaces.component.TreeRowKey;
-
-/**
- * @author Nick Belaevski - nbelaevski(a)exadel.com
- * created 30.12.2006
- *
- */
-public interface TreeDataBatchLocator {
- public Object[] createLocator(Object[] data, TreeRowKey rowKey);
- public Object[] createData(Object[] locator, TreeRowKey rowKey);
-}
Deleted:
trunk/richfaces/tree/src/main/java/org/richfaces/component/preserve/TreeDataLocator.java
===================================================================
---
trunk/richfaces/tree/src/main/java/org/richfaces/component/preserve/TreeDataLocator.java 2007-06-26
16:13:22 UTC (rev 1326)
+++
trunk/richfaces/tree/src/main/java/org/richfaces/component/preserve/TreeDataLocator.java 2007-06-26
16:14:55 UTC (rev 1327)
@@ -1,34 +0,0 @@
-/**
- * License Agreement.
- *
- * JBoss RichFaces 3.0 - Ajax4jsf Component Library
- *
- * Copyright (C) 2007 Exadel, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1 as published by the Free Software Foundation.
- *
- * This library 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 library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-package org.richfaces.component.preserve;
-
-import org.richfaces.component.TreeRowKey;
-
-/**
- * @author Nick Belaevski - nbelaevski(a)exadel.com
- * created 30.12.2006
- *
- */
-public interface TreeDataLocator {
- public Object createLocator(Object data, TreeRowKey rowKey);
- public Object createData(Object locator, TreeRowKey rowKey);
-}
Deleted:
trunk/richfaces/tree/src/main/java/org/richfaces/component/preserve/TreeNodeInfo.java
===================================================================
---
trunk/richfaces/tree/src/main/java/org/richfaces/component/preserve/TreeNodeInfo.java 2007-06-26
16:13:22 UTC (rev 1326)
+++
trunk/richfaces/tree/src/main/java/org/richfaces/component/preserve/TreeNodeInfo.java 2007-06-26
16:14:55 UTC (rev 1327)
@@ -1,32 +0,0 @@
-/**
- * License Agreement.
- *
- * JBoss RichFaces 3.0 - Ajax4jsf Component Library
- *
- * Copyright (C) 2007 Exadel, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1 as published by the Free Software Foundation.
- *
- * This library 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 library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-package org.richfaces.component.preserve;
-
-import org.richfaces.component.TreeRowKey;
-
-public interface TreeNodeInfo {
- public TreeRowKey getRowKey();
- public Object getData();
- public void setData(Object data);
- public boolean isLast();
- public boolean isLeaf();
-}
\ No newline at end of file
Modified: trunk/richfaces/tree/src/main/java/org/richfaces/component/state/TreeState.java
===================================================================
---
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/TreeState.java 2007-06-26
16:13:22 UTC (rev 1326)
+++
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/TreeState.java 2007-06-26
16:14:55 UTC (rev 1327)
@@ -27,18 +27,13 @@
import javax.faces.application.FacesMessage;
import javax.faces.component.StateHolder;
-import javax.faces.component.UIComponentBase;
import javax.faces.context.FacesContext;
-import javax.faces.el.ValueBinding;
import org.ajax4jsf.ajax.repeat.DataComponentState;
import org.ajax4jsf.ajax.repeat.DataVisitor;
import org.ajax4jsf.ajax.repeat.Range;
-import org.richfaces.component.CacheableTreeDataModel;
import org.richfaces.component.TreeRowKey;
import org.richfaces.component.UITree;
-import org.richfaces.component.preserve.TreeDataBatchLocator;
-import org.richfaces.component.preserve.TreeDataLocator;
import org.richfaces.component.state.events.TreeStateCommandsListener;
/**
@@ -48,14 +43,16 @@
public class TreeState implements DataComponentState, TreeStateCommandsListener,
StateHolder {
private final class Visitor implements DataVisitor {
private TreeRowKey key;
+ private UITree tree;
- public Visitor(TreeRowKey key) {
+ public Visitor(TreeRowKey key, UITree tree) {
super();
this.key = key;
+ this.tree = tree;
}
public void process(FacesContext context, Object rowKey, Object argument)
- throws IOException {
+ throws IOException {
tree.setRowKey(rowKey);
if (tree.isRowAvailable()) {
TreeRowKey nextKey = (TreeRowKey) rowKey;
@@ -90,6 +87,8 @@
return true;
}
};
+
+ private boolean stopInCollapsed = false;
private TreeRowKey selectedNode = null;
@@ -99,13 +98,9 @@
private Set queuedCollapsedNodes = new HashSet();
- private UITree tree;
-
-
- public TreeState(UITree tree, boolean stopInCollapsed) {
+ public TreeState(boolean stopInCollapsed) {
super();
this.stopInCollapsed = stopInCollapsed;
- this.tree = tree;
}
public boolean isExpanded(TreeRowKey rowKey) {
@@ -114,7 +109,7 @@
}
return expandedNodes.contains(rowKey)
- || queuedExpandedNodes.contains(rowKey);
+ || queuedExpandedNodes.contains(rowKey);
}
public boolean isSelected(TreeRowKey rowKey) {
@@ -149,8 +144,6 @@
private boolean _transient;
- private boolean stopInCollapsed;
-
private transient TreeRange treeRange = null;
public Range getRange() {
@@ -190,78 +183,16 @@
selectedNode = (TreeRowKey) _state[3];
queuedExpandedNodes = (Set) _state[4];
queuedCollapsedNodes = (Set) _state[5];
- treeDataModel = (CacheableTreeDataModel) UIComponentBase.restoreAttachedState(context,
_state[6]);
- ValueBinding treeDataLocatorBinding = tree
- .getValueBinding(UITree.TREE_DATA_LOCATOR_BINDING);
- if (treeDataLocatorBinding != null) {
- Object object = treeDataLocatorBinding.getValue(context);
- if (object instanceof TreeDataLocator) {
- final TreeDataLocator treeDataLocator = (TreeDataLocator) object;
- if (treeDataModel != null) {
- try {
- treeDataModel.walk(context, new DataVisitor() {
-
- public void process(FacesContext arg0, Object arg1,
- Object arg2) throws IOException {
- treeDataModel.setRowKey(arg1);
- treeDataModel.setRowData(treeDataLocator
- .createData(treeDataModel.getRowData(),
- (TreeRowKey) arg1));
- }
-
- }, null, null);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- } else {
- TreeDataBatchLocator treeDataBatchLocator = (TreeDataBatchLocator) object;
- // TODO implement batch processing
- }
- }
}
public Object saveState(FacesContext context) {
- Object[] state = new Object[7];
+ Object[] state = new Object[6];
state[0] = expandedNodes;
state[1] = new Boolean(_transient);
state[2] = new Boolean(stopInCollapsed);
state[3] = selectedNode;
state[4] = queuedExpandedNodes;
state[5] = queuedCollapsedNodes;
- if (!UITree.PRESERVE_MODEL_REQUEST.equals(tree.getPreserveModel())) {
- ValueBinding treeDataLocatorBinding = tree
- .getValueBinding(UITree.TREE_DATA_LOCATOR_BINDING);
- if (treeDataLocatorBinding != null) {
- Object object = treeDataLocatorBinding.getValue(context);
- if (object instanceof TreeDataLocator) {
- final TreeDataLocator treeDataLocator = (TreeDataLocator) object;
- if (treeDataModel != null) {
- try {
- treeDataModel.walk(context, new DataVisitor() {
-
- public void process(FacesContext arg0,
- Object arg1, Object arg2)
- throws IOException {
- treeDataModel.setRowKey(arg1);
- treeDataModel.setRowData(treeDataLocator
- .createLocator(treeDataModel
- .getRowData(),
- (TreeRowKey) arg1));
- }
-
- }, null, null);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- } else {
- TreeDataBatchLocator treeDataBatchLocator = (TreeDataBatchLocator) object;
- // TODO implement batch processing
- }
- }
- state[6] = UIComponentBase.saveAttachedState(context, treeDataModel);
- }
return state;
}
@@ -277,21 +208,21 @@
this.stopInCollapsed = stopInCollapsed;
}
- private void visitNodes(TreeRange treeRange, TreeRowKey rootKey)
- throws IOException {
+ private void visitNodes(UITree tree, TreeRange treeRange, TreeRowKey rootKey)
+ throws IOException {
try {
this.treeRange = treeRange;
Object oldKey = tree.getRowKey();
tree.walkModel(FacesContext.getCurrentInstance(), new Visitor(
- rootKey), rootKey, null);
+ rootKey, tree), treeRange, rootKey, null);
tree.setRowKey(oldKey);
} finally {
this.treeRange = null;
}
}
- public void expandAll() throws IOException {
+ public void expandAll(UITree tree) throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
queuedCollapsedNodes.clear();
// SubTreeChildrenAppender infoAppender = null;
@@ -301,17 +232,17 @@
// infoAppender = storedPersister.getAppender(null);
// }
- visitNodes(RANGE_UNCONSTRAINED, null);
+ visitNodes(tree, RANGE_UNCONSTRAINED, null);
}
- public void collapseAll() throws IOException {
+ public void collapseAll(UITree tree) throws IOException {
expandedNodes.clear();
queuedExpandedNodes.clear();
// RequestUtils.setStoredPersister(tree.getBaseClientId(context),
// context, null);
}
- public void collapseNode(TreeRowKey rowKey) throws IOException {
+ public void collapseNode(UITree tree, TreeRowKey rowKey) throws IOException {
expandedNodes.remove(rowKey);
queuedExpandedNodes.remove(rowKey);
queuedCollapsedNodes.add(rowKey);
@@ -323,7 +254,7 @@
// }
}
- public void expandNode(final TreeRowKey rowKey) throws IOException {
+ public void expandNode(UITree tree, final TreeRowKey rowKey) throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
// SubTreeChildrenAppender infoAppender;
// if (storedPersister != null) {
@@ -333,40 +264,22 @@
// }
TreeRange range;
- if (treeDataModel == null) {
- // it's enough to traverse only subkeys of the node
- // we're opening
- range = new TreeRange() {
- public boolean processChildren(TreeRowKey nextKey) {
- return true;
- }
+ // it's enough to traverse only subkeys of the node
+ // we're opening
+ range = new TreeRange() {
+ public boolean processChildren(TreeRowKey nextKey) {
+ return true;
+ }
- public boolean processNode(TreeRowKey nextKey) {
- return (rowKey == null && nextKey == null)
- || nextKey.equals(rowKey)
- || nextKey.isSubKey(rowKey);
- }
+ public boolean processNode(TreeRowKey nextKey) {
+ return (rowKey == null && nextKey == null)
+ || nextKey.equals(rowKey)
+ || nextKey.isSubKey(rowKey);
+ }
- };
- visitNodes(range, rowKey);
- } else {
- final TreeRange expandedRange = (TreeRange) getRange();
- range = new TreeRange() {
+ };
+ visitNodes(tree, range, rowKey);
- public boolean processChildren(TreeRowKey key) {
- return expandedRange.processChildren(key) || key == null
- || key.isSubKey(rowKey);
- }
-
- public boolean processNode(TreeRowKey key) {
- return expandedRange.processNode(key) || key == null
- || key.isSubKey(rowKey) || key.equals(rowKey);
- }
-
- };
- visitNodes(range, rowKey);
- }
-
}
public void transferQueuedNodes() {
@@ -375,14 +288,4 @@
expandedNodes.removeAll(queuedCollapsedNodes);
queuedCollapsedNodes.clear();
}
-
- private CacheableTreeDataModel treeDataModel;
-
- public CacheableTreeDataModel getTreeDataModel() {
- return treeDataModel;
- }
-
- public void setTreeDataModel(CacheableTreeDataModel treeDataModel) {
- this.treeDataModel = treeDataModel;
- }
}
Modified:
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/CollapseAllCommandEvent.java
===================================================================
---
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/CollapseAllCommandEvent.java 2007-06-26
16:13:22 UTC (rev 1326)
+++
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/CollapseAllCommandEvent.java 2007-06-26
16:14:55 UTC (rev 1327)
@@ -25,7 +25,9 @@
import javax.faces.component.UIComponent;
+import org.richfaces.component.UITree;
+
/**
* @author Nick - mailto:nbelaevski@exadel.com
* created 01.12.2006
@@ -43,7 +45,7 @@
private static final long serialVersionUID = 4670035007769731387L;
protected void execute(TreeStateCommandsListener commandsListener) throws IOException {
- commandsListener.collapseAll();
+ commandsListener.collapseAll((UITree) getComponent());
}
}
Modified:
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/CollapseNodeCommandEvent.java
===================================================================
---
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/CollapseNodeCommandEvent.java 2007-06-26
16:13:22 UTC (rev 1326)
+++
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/CollapseNodeCommandEvent.java 2007-06-26
16:14:55 UTC (rev 1327)
@@ -26,6 +26,7 @@
import javax.faces.component.UIComponent;
import org.richfaces.component.TreeRowKey;
+import org.richfaces.component.UITree;
/**
* @author Nick - mailto:nbelaevski@exadel.com
@@ -44,7 +45,7 @@
}
protected void execute(TreeStateCommandsListener commandsListener) throws IOException {
- commandsListener.collapseNode(getRowKey());
+ commandsListener.collapseNode((UITree) getComponent(), getRowKey());
}
}
Modified:
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/ExpandAllCommandEvent.java
===================================================================
---
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/ExpandAllCommandEvent.java 2007-06-26
16:13:22 UTC (rev 1326)
+++
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/ExpandAllCommandEvent.java 2007-06-26
16:14:55 UTC (rev 1327)
@@ -25,7 +25,9 @@
import javax.faces.component.UIComponent;
+import org.richfaces.component.UITree;
+
/**
* @author Nick - mailto:nbelaevski@exadel.com
* created 01.12.2006
@@ -43,7 +45,7 @@
private static final long serialVersionUID = -6665782819629856720L;
protected void execute(TreeStateCommandsListener commandsListener) throws IOException {
- commandsListener.expandAll();
+ commandsListener.expandAll((UITree) getComponent());
}
}
Modified:
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/ExpandNodeCommandEvent.java
===================================================================
---
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/ExpandNodeCommandEvent.java 2007-06-26
16:13:22 UTC (rev 1326)
+++
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/ExpandNodeCommandEvent.java 2007-06-26
16:14:55 UTC (rev 1327)
@@ -26,6 +26,7 @@
import javax.faces.component.UIComponent;
import org.richfaces.component.TreeRowKey;
+import org.richfaces.component.UITree;
/**
* @author Nick - mailto:nbelaevski@exadel.com
@@ -44,7 +45,7 @@
}
protected void execute(TreeStateCommandsListener commandsListener) throws IOException {
- commandsListener.expandNode(getRowKey());
+ commandsListener.expandNode((UITree) getComponent(), getRowKey());
}
}
Modified:
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/TreeStateCommandsListener.java
===================================================================
---
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/TreeStateCommandsListener.java 2007-06-26
16:13:22 UTC (rev 1326)
+++
trunk/richfaces/tree/src/main/java/org/richfaces/component/state/events/TreeStateCommandsListener.java 2007-06-26
16:14:55 UTC (rev 1327)
@@ -26,6 +26,7 @@
import javax.faces.event.FacesListener;
import org.richfaces.component.TreeRowKey;
+import org.richfaces.component.UITree;
/**
* @author Nick - mailto:nbelaevski@exadel.com
@@ -33,8 +34,8 @@
*
*/
public interface TreeStateCommandsListener extends FacesListener {
- public void expandNode(TreeRowKey rowKey) throws IOException;
- public void collapseNode(TreeRowKey rowKey) throws IOException;
- public void expandAll() throws IOException;
- public void collapseAll() throws IOException;
+ public void expandNode(UITree tree, TreeRowKey rowKey) throws IOException;
+ public void collapseNode(UITree tree, TreeRowKey rowKey) throws IOException;
+ public void expandAll(UITree tree) throws IOException;
+ public void collapseAll(UITree tree) throws IOException;
}
Modified:
trunk/richfaces/tree/src/main/java/org/richfaces/renderkit/TreeDataModelEventNavigator.java
===================================================================
---
trunk/richfaces/tree/src/main/java/org/richfaces/renderkit/TreeDataModelEventNavigator.java 2007-06-26
16:13:22 UTC (rev 1326)
+++
trunk/richfaces/tree/src/main/java/org/richfaces/renderkit/TreeDataModelEventNavigator.java 2007-06-26
16:14:55 UTC (rev 1327)
@@ -112,10 +112,6 @@
public abstract void afterUp(int levels) throws IOException;
public abstract void afterDown() throws IOException;
- protected UITree getTree() {
- return tree;
- }
-
public void setLastElement() {
lastElement = true;
}
Modified:
trunk/richfaces/tree/src/main/java/org/richfaces/renderkit/TreeRendererBase.java
===================================================================
---
trunk/richfaces/tree/src/main/java/org/richfaces/renderkit/TreeRendererBase.java 2007-06-26
16:13:22 UTC (rev 1326)
+++
trunk/richfaces/tree/src/main/java/org/richfaces/renderkit/TreeRendererBase.java 2007-06-26
16:14:55 UTC (rev 1327)
@@ -48,11 +48,98 @@
import org.richfaces.component.UITree;
import org.richfaces.component.UITreeNode;
import org.richfaces.component.nsutils.NSUtils;
+import org.richfaces.component.state.TreeRange;
import org.richfaces.component.state.TreeState;
import org.richfaces.component.state.TreeStateAdvisor;
public abstract class TreeRendererBase extends CompositeRenderer {
+ private final class RendererDataModelEventNavigator extends
+ TreeDataModelEventNavigator {
+ private final FacesContext context;
+ private final UITree tree;
+ private final Flag droppedDownToLevelFlag;
+ private final ResponseWriter writer;
+
+ private String clientId;
+ private boolean expanded;
+ private boolean showLines;
+
+ private RendererDataModelEventNavigator(UITree tree,
+ TreeRowKey floatingKey, FacesContext context, Flag droppedDownToLevelFlag) {
+ super(tree, floatingKey);
+ this.context = context;
+ this.tree = tree;
+ this.droppedDownToLevelFlag = droppedDownToLevelFlag;
+ this.writer = context.getResponseWriter();
+
+ this.expanded = this.tree.isExpanded();
+ this.showLines = this.tree.isShowConnectingLines();
+ this.clientId = getClientId();
+ }
+
+ public void followRowKey(TreeRowKey newRowKey) throws IOException {
+ super.followRowKey(newRowKey);
+
+ this.expanded = this.tree.isExpanded();
+ this.clientId = getClientId();
+ }
+
+ private String getClientId() {
+ Object rowKey = tree.getRowKey();
+ String id;
+ if (rowKey == null) {
+ id = tree.getClientId(context)
+ + NamingContainer.SEPARATOR_CHAR;
+ } else {
+ id = tree.getNodeFacet().getClientId(context)
+ + NamingContainer.SEPARATOR_CHAR;
+ }
+ return id;
+ }
+
+ public void afterDown() throws IOException {
+ openLevelDownTable(context, tree, writer);
+ }
+
+ public void afterUp(int levels) throws IOException {
+ for (int i = 0; i < levels; i++) {
+ closeLevelDownTable(context, tree, writer);
+ writer.endElement("td");
+ writer.endElement("tr");
+ }
+ }
+
+ public void beforeDown() throws IOException {
+ droppedDownToLevelFlag.setFlag();
+
+ writer.startElement("tr", tree);
+ getUtils().writeAttribute(writer, "id", clientId + "childs");
+
+ if (!expanded) {
+ getUtils().writeAttribute(writer, "style", "display: none;");
+ }
+
+ if (this.getRowKey() != null) {
+ writer.startElement("td", tree);
+ if (!isStackedLastElement()) {
+ if (showLines)
+ getUtils().writeAttribute(writer, "class",
+ "dr-tree-h-ic-line");
+ }
+ writer.endElement("td");
+ }
+
+ writer.startElement("td", tree);
+ getUtils().writeAttribute(writer, "colspan", "2");
+ getUtils().writeAttribute(writer, "id", clientId + "childs:td");
+ getUtils().writeAttribute(writer, "valign", "top");
+ }
+
+ public void beforeUp(int levels) {
+ }
+ }
+
private class DataVisitorWithLastElement implements DataVisitor,
LastElementAware {
@@ -154,12 +241,12 @@
if (null != adviseOpened) {
if (adviseOpened.booleanValue()) {
if (!componentState.isExpanded(rowKey)) {
- componentState.expandNode(rowKey);
+ componentState.expandNode(tree, rowKey);
}
}
else {
if (componentState.isExpanded(rowKey)) {
- componentState.collapseNode(rowKey);
+ componentState.collapseNode(tree, rowKey);
}
}
}
@@ -362,64 +449,6 @@
TreeRowKey rowKey = (TreeRowKey) key;
- final TreeDataModelEventNavigator levelNavigator = new TreeDataModelEventNavigator(
- input, rowKey) {
-
- public void afterDown() throws IOException {
- openLevelDownTable(context, input, writer);
- }
-
- public void afterUp(int levels) throws IOException {
- for (int i = 0; i < levels; i++) {
- closeLevelDownTable(context, input, writer);
- writer.endElement("td");
- writer.endElement("tr");
- }
- }
-
- public void beforeDown() throws IOException {
- droppedDownToLevelFlag.setFlag();
-
- String id;
-
- Object rowKey = getTree().getRowKey();
- if (rowKey == null) {
- id = getTree().getClientId(context)
- + NamingContainer.SEPARATOR_CHAR;
- } else {
- id = getTree().getNodeFacet().getClientId(context)
- + NamingContainer.SEPARATOR_CHAR;
- }
-
-
- writer.startElement("tr", input);
- getUtils().writeAttribute(writer, "id", id + "childs");
-
- if (!getTree().isExpanded()) {
- getUtils()
- .writeAttribute(writer, "style", "display: none;");
- }
-
- if (this.getRowKey() != null) {
- writer.startElement("td", input);
- if (!isStackedLastElement()) {
- if (getTree().isShowConnectingLines())
- getUtils().writeAttribute(writer, "class",
- "dr-tree-h-ic-line");
- }
- writer.endElement("td");
- }
-
- writer.startElement("td", input);
- getUtils().writeAttribute(writer, "colspan", "2");
- getUtils().writeAttribute(writer, "id", id + "childs:td");
- getUtils().writeAttribute(writer, "valign", "top");
- }
-
- public void beforeUp(int levels) {
- }
- };
-
final StringHolder selectionValueHolder = new StringHolder();
//Object savedRowKey = input.getRowKey();
@@ -434,9 +463,37 @@
input.setRowKey(null);
}
+ TreeDataModelEventNavigator levelNavigator = new
RendererDataModelEventNavigator(input, rowKey, context,
+ droppedDownToLevelFlag);
+
+ final TreeRange stateRange = (TreeRange) input.getComponentState().getRange();
+ TreeRange treeRange = new TreeRange() {
+
+ public boolean processChildren(TreeRowKey rowKey) {
+ return stateRange.processChildren(rowKey);
+ }
+
+ public boolean processNode(TreeRowKey rowKey) {
+ Object currentKey = input.getRowKey();
+
+ if (currentKey == null ? rowKey != null : !currentKey.equals(rowKey)) {
+ //currentKey NE rowKey
+ input.setRowKey(rowKey);
+ }
+
+ UITreeNode nodeFacet = input.getNodeFacet();
+ if (!nodeFacet.isRendered()) {
+ return false;
+ }
+
+ return stateRange.processNode(rowKey);
+ }
+
+ };
+
input.walk(context, new DataVisitorWithLastElement(writer,
selectionValueHolder, droppedDownToLevelFlag, input,
- levelNavigator), key, null);
+ levelNavigator), treeRange, key, null);
if (key != null) {
closeLevelDownTable(context, input, writer);
Modified:
trunk/richfaces/tree/src/test/java/org/richfaces/component/state/events/MockTreeStateCommandsListener.java
===================================================================
---
trunk/richfaces/tree/src/test/java/org/richfaces/component/state/events/MockTreeStateCommandsListener.java 2007-06-26
16:13:22 UTC (rev 1326)
+++
trunk/richfaces/tree/src/test/java/org/richfaces/component/state/events/MockTreeStateCommandsListener.java 2007-06-26
16:14:55 UTC (rev 1327)
@@ -24,6 +24,7 @@
import java.io.IOException;
import org.richfaces.component.TreeRowKey;
+import org.richfaces.component.UITree;
/**
* @author Nick Belaevski - nbelaevski(a)exadel.com
@@ -37,19 +38,19 @@
private TreeRowKey collapseNode;
private TreeRowKey expandNode;
- public void collapseAll() throws IOException {
+ public void collapseAll(UITree tree) throws IOException {
this.collapseAll = true;
}
- public void collapseNode(TreeRowKey rowKey) throws IOException {
+ public void collapseNode(UITree tree, TreeRowKey rowKey) throws IOException {
this.collapseNode = rowKey;
}
- public void expandAll() throws IOException {
+ public void expandAll(UITree tree) throws IOException {
this.expandAll = true;
}
- public void expandNode(TreeRowKey rowKey) throws IOException {
+ public void expandNode(UITree tree, TreeRowKey rowKey) throws IOException {
this.expandNode = rowKey;
}
@@ -73,19 +74,19 @@
class MockExceptionTreeStateCommandsListener extends MockTreeStateCommandsListener {
- public void collapseAll() throws IOException {
+ public void collapseAll(UITree tree) throws IOException {
throw new IOException();
}
- public void collapseNode(TreeRowKey rowKey) throws IOException {
+ public void collapseNode(UITree tree, TreeRowKey rowKey) throws IOException {
throw new IOException();
}
- public void expandAll() throws IOException {
+ public void expandAll(UITree tree) throws IOException {
throw new IOException();
}
- public void expandNode(TreeRowKey rowKey) throws IOException {
+ public void expandNode(UITree tree, TreeRowKey rowKey) throws IOException {
throw new IOException();
}