Author: nbelaevski
Date: 2010-11-29 15:28:16 -0500 (Mon, 29 Nov 2010)
New Revision: 20213
Added:
trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModelTuple.java
Removed:
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/ExtendedTreeDataModelImpl.java
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/SequenceRowKeyIterator.java
Modified:
trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/LazyTreeNode.java
trunk/ui/common/ui/src/main/java/org/richfaces/component/RowKeyContextEventWrapper.java
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/TreeDataVisitor.java
trunk/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTree.java
trunk/ui/iteration/ui/src/main/java/org/richfaces/component/TreeRange.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
trunk/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeRendererBase.java
Log:
RF-9680:
- Added children() method to TreeDataModel & tuples
- Related refactorings for UIDataAdaptor
- Redesign API for walking over model
- Renderer updated for new API
Modified:
trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/LazyTreeNode.java
===================================================================
---
trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/LazyTreeNode.java 2010-11-29
20:14:12 UTC (rev 20212)
+++
trunk/examples/iteration-demo/src/main/java/org/richfaces/demo/LazyTreeNode.java 2010-11-29
20:28:16 UTC (rev 20213)
@@ -93,11 +93,7 @@
}
public boolean isLeaf() {
- if (children == null) {
- return false;
- }
-
- return children.isEmpty();
+ return false;
}
public Enumeration children() {
Modified:
trunk/ui/common/ui/src/main/java/org/richfaces/component/RowKeyContextEventWrapper.java
===================================================================
---
trunk/ui/common/ui/src/main/java/org/richfaces/component/RowKeyContextEventWrapper.java 2010-11-29
20:14:12 UTC (rev 20212)
+++
trunk/ui/common/ui/src/main/java/org/richfaces/component/RowKeyContextEventWrapper.java 2010-11-29
20:28:16 UTC (rev 20213)
@@ -23,26 +23,34 @@
package org.richfaces.component;
import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.event.AbortProcessingException;
import javax.faces.event.FacesEvent;
import javax.faces.event.FacesListener;
import javax.faces.event.PhaseId;
+import org.richfaces.log.Logger;
+import org.richfaces.log.RichfacesLogger;
+
/**
* @author Nick Belaevski
*/
-class RowKeyContextEventWrapper extends FacesEvent {
+public class RowKeyContextEventWrapper extends FacesEvent {
- /**
- *
- */
private static final long serialVersionUID = -869970815228914529L;
+
+ private static final Logger LOGGER = RichfacesLogger.COMPONENTS.getLogger();
+
private FacesEvent event;
- private Object rowKey;
+ private Object eventRowKey;
- public RowKeyContextEventWrapper(UIComponent component, FacesEvent event, Object
rowKey) {
+ private Object initialRowKey;
+
+ public RowKeyContextEventWrapper(UIDataAdaptor component, FacesEvent event, Object
eventRowKey) {
super(component);
+
this.event = event;
- this.rowKey = rowKey;
+ this.eventRowKey = eventRowKey;
}
public FacesEvent getFacesEvent() {
@@ -65,10 +73,54 @@
throw new IllegalStateException();
}
- /**
- * @return the rowKey
- */
- public Object getRowKey() {
- return rowKey;
+ public UIDataAdaptor getComponent() {
+ return (UIDataAdaptor) super.getComponent();
}
+
+ public Object getEventRowKey() {
+ return eventRowKey;
+ }
+
+ protected void setupEventContext(FacesContext facesContext) {
+ getComponent().setRowKey(facesContext, getEventRowKey());
+ }
+
+ public void broadcast(FacesContext context) throws AbortProcessingException {
+ // Set up the correct context and fire our wrapped event
+ UIDataAdaptor dataAdaptor = getComponent();
+ initialRowKey = dataAdaptor.getRowKey();
+
+ UIComponent compositeParent = null;
+
+ UIComponent targetComponent = event.getComponent();
+
+ try {
+ if (!UIComponent.isCompositeComponent(targetComponent)) {
+ compositeParent =
UIComponent.getCompositeComponentParent(targetComponent);
+ }
+
+ if (compositeParent != null) {
+ compositeParent.pushComponentToEL(context, null);
+ }
+
+ setupEventContext(context);
+
+ targetComponent.pushComponentToEL(context, null);
+ targetComponent.broadcast(event);
+ } finally {
+ try {
+ dataAdaptor.setRowKey(context, initialRowKey);
+ } catch (Exception e) {
+ LOGGER.error(e.getMessage(), e);
+ }
+
+ initialRowKey = null;
+
+ targetComponent.popComponentFromEL(context);
+
+ if (compositeParent != null) {
+ compositeParent.popComponentFromEL(context);
+ }
+ }
+ }
}
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:14:12 UTC (rev 20212)
+++ trunk/ui/common/ui/src/main/java/org/richfaces/component/UIDataAdaptor.java 2010-11-29
20:28:16 UTC (rev 20213)
@@ -29,7 +29,6 @@
import java.util.Collections;
import java.util.Iterator;
import java.util.Map;
-import java.util.Set;
import javax.el.ValueExpression;
import javax.faces.FacesException;
@@ -244,8 +243,13 @@
//TODO nick - PSH support?
private DataComponentState componentState = null;
private ExtendedDataModel<?> extendedDataModel = null;
+
private Object rowKey = null;
+ private boolean rowDataIsSet = false;
+
+ private Object rowData;
+
private String clientId;
private Object originalVarValue;
@@ -348,18 +352,6 @@
}
/*
- * (non-Javadoc)
- *
- * @see
org.ajax4jsf.component.AjaxChildrenEncoder#encodeAjaxChild(javax.faces.context.FacesContext,
- * java.lang.String, java.util.Set, java.util.Set)
- */
- public void encodeAjaxChild(FacesContext context, String path, Set<String> ids,
Set<String> renderedAreas)
- throws IOException {
-
- // TODO Auto-generated method stub
- }
-
- /*
* (non-Javadoc)
* @see
javax.faces.component.UniqueIdVendor#createUniqueId(javax.faces.context.FacesContext,
java.lang.String)
*/
@@ -379,6 +371,34 @@
return rowKey;
}
+ private void setRowKeyAndData(FacesContext facesContext, Object rowKey, boolean
localRowDataAvailable, Object localRowData) {
+ 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);
+ }
+
+ this.clientId = null;
+
+ boolean rowSelected = (rowKey != null) && isRowAvailable();
+
+ setupVariable(facesContext, rowSelected);
+
+ 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
@@ -390,15 +410,7 @@
* @param key new key value.
*/
public void setRowKey(FacesContext facesContext, Object rowKey) {
- this.saveChildState(facesContext);
- this.rowKey = rowKey;
- this.clientId = null;
- getExtendedDataModel().setRowKey(rowKey);
-
- boolean rowSelected = (rowKey != null) && isRowAvailable();
-
- setupVariable(facesContext, rowSelected);
- this.restoreChildState(facesContext);
+ setRowKeyAndData(facesContext, rowKey, false, null);
}
/**
@@ -546,13 +558,13 @@
setRowKey(getFacesContext(), rowKey);
}
- /*
- * (non-Javadoc)
- * @see
javax.faces.component.UIComponentBase#queueEvent(javax.faces.event.FacesEvent)
- */
+ protected FacesEvent wrapEvent(FacesEvent event) {
+ return new RowKeyContextEventWrapper(this, event, getRowKey());
+ }
+
@Override
public void queueEvent(FacesEvent event) {
- super.queueEvent(new RowKeyContextEventWrapper(this, event, getRowKey()));
+ super.queueEvent(wrapEvent(event));
}
/*
@@ -561,64 +573,16 @@
*/
@Override
public void broadcast(FacesEvent event) throws AbortProcessingException {
- if (!(event instanceof RowKeyContextEventWrapper)) {
- if (!broadcastLocal(event)) {
- super.broadcast(event);
- }
-
- return;
+ if (event instanceof RowKeyContextEventWrapper) {
+ RowKeyContextEventWrapper eventWrapper = (RowKeyContextEventWrapper) event;
+
+ eventWrapper.broadcast(getFacesContext());
+ } else {
+ super.broadcast(event);
}
-
- FacesContext context = getFacesContext();
-
- // Set up the correct context and fire our wrapped event
- RowKeyContextEventWrapper revent = (RowKeyContextEventWrapper) event;
- Object oldRowKey = getRowKey();
-
- setRowKey(context, revent.getRowKey());
-
- FacesEvent rowEvent = revent.getFacesEvent();
- UIComponent source = rowEvent.getComponent();
- UIComponent compositeParent = null;
-
- try {
- if (!UIComponent.isCompositeComponent(source)) {
- compositeParent = UIComponent.getCompositeComponentParent(source);
- }
-
- if (compositeParent != null) {
- compositeParent.pushComponentToEL(context, null);
- }
-
- source.pushComponentToEL(context, null);
- source.broadcast(rowEvent);
- } finally {
- source.popComponentFromEL(context);
-
- if (compositeParent != null) {
- compositeParent.popComponentFromEL(context);
- }
- }
-
- setRowKey(context, oldRowKey);
}
/**
- * Process events targetted for concrete implementation. Hook method called
- * from {@link #broadcast(FacesEvent)}
- *
- * @param event -
- * processed event.
- * @return true if event processed, false if component must continue
- * processing.
- */
-
- // TODO - is it still actual?
- protected boolean broadcastLocal(FacesEvent event) {
- return false;
- }
-
- /**
* @return the extendedDataModel
*/
protected ExtendedDataModel<?> getExtendedDataModel() {
@@ -671,11 +635,15 @@
}
public Object getRowData() {
+ if (rowDataIsSet) {
+ return rowData;
+ }
+
return getExtendedDataModel().getRowData();
}
public boolean isRowAvailable() {
- return getExtendedDataModel().isRowAvailable();
+ return rowDataIsSet || getExtendedDataModel().isRowAvailable();
}
/**
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:14:12 UTC (rev 20212)
+++ trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModel.java 2010-11-29
20:28:16 UTC (rev 20213)
@@ -21,10 +21,8 @@
*/
package org.richfaces.model;
-import javax.faces.context.FacesContext;
+import java.util.Iterator;
-import org.ajax4jsf.model.DataVisitor;
-import org.ajax4jsf.model.Range;
/**
* @author Nick Belaevski
@@ -43,12 +41,8 @@
public E getData();
- public void walk(FacesContext context, DataVisitor visitor, Range range, Object
argument);
+ public Iterator<TreeDataModelTuple> children();
- public void enterNode(DataVisitor visitor);
-
- public void exitNode(DataVisitor visitor);
-
public Object getParentRowKey(Object rowKey);
public Object getWrappedData();
Copied: trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModelTuple.java
(from rev 20136,
trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataVisitor.java)
===================================================================
--- trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModelTuple.java
(rev 0)
+++
trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataModelTuple.java 2010-11-29
20:28:16 UTC (rev 20213)
@@ -0,0 +1,48 @@
+/*
+ * 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;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class TreeDataModelTuple {
+
+ private Object rowKey;
+
+ private Object data;
+
+ public TreeDataModelTuple(Object rowKey, Object data) {
+ super();
+ this.rowKey = rowKey;
+ this.data = data;
+ }
+
+ public Object getRowKey() {
+ return rowKey;
+ }
+
+ public Object getData() {
+ return data;
+ }
+
+}
Modified: trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataVisitor.java
===================================================================
---
trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataVisitor.java 2010-11-29
20:14:12 UTC (rev 20212)
+++
trunk/ui/iteration/api/src/main/java/org/richfaces/model/TreeDataVisitor.java 2010-11-29
20:28:16 UTC (rev 20213)
@@ -21,13 +21,12 @@
*/
package org.richfaces.model;
-import org.ajax4jsf.model.DataVisitor;
/**
* @author Nick Belaevski
*
*/
-public interface TreeDataVisitor extends DataVisitor {
+public interface TreeDataVisitor {
public void enterNode();
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:14:12 UTC (rev 20212)
+++
trunk/ui/iteration/ui/src/main/java/org/richfaces/component/AbstractTree.java 2010-11-29
20:28:16 UTC (rev 20213)
@@ -45,11 +45,10 @@
import javax.faces.event.ExceptionQueuedEventContext;
import javax.faces.event.FacesEvent;
import javax.faces.event.PhaseId;
-import javax.swing.tree.TreeNode;
import org.ajax4jsf.model.DataComponentState;
+import org.ajax4jsf.model.DataVisitor;
import org.ajax4jsf.model.ExtendedDataModel;
-import org.ajax4jsf.model.Range;
import org.richfaces.application.MessageFactory;
import org.richfaces.application.ServiceTracker;
import org.richfaces.appplication.FacesMessages;
@@ -69,9 +68,10 @@
import org.richfaces.event.TreeToggleEvent;
import org.richfaces.event.TreeToggleListener;
import org.richfaces.event.TreeToggleSource;
-import org.richfaces.model.ExtendedTreeDataModelImpl;
import org.richfaces.model.SwingTreeNodeDataModelImpl;
import org.richfaces.model.TreeDataModel;
+import org.richfaces.model.TreeDataModelTuple;
+import org.richfaces.model.TreeDataVisitor;
import org.richfaces.renderkit.MetaComponentRenderer;
import com.google.common.base.Predicate;
@@ -125,31 +125,31 @@
private static final Converter ROW_KEY_CONVERTER = new SequenceRowKeyConverter();
- /**
- * @author Nick Belaevski
- *
- */
- private final class TreeComponentState implements DataComponentState {
- public Range getRange() {
- return new TreeRange(getFacesContext(), AbstractTree.this);
- }
- }
-
private enum PropertyKeys {
selection
}
-
+
@Attribute(generate = false, signature = @Signature(returnType = Void.class,
parameters = TreeSelectionChangeEvent.class))
private MethodExpression selectionChangeListener;
@Attribute(generate = false, signature = @Signature(returnType = Void.class,
parameters = TreeToggleListener.class))
private MethodExpression toggleListener;
+ private transient TreeRange treeRange;
+
public AbstractTree() {
setKeepSaved(true);
setRendererType("org.richfaces.TreeRenderer");
}
+ protected TreeRange getTreeRange() {
+ if (treeRange == null) {
+ treeRange = new TreeRange(this);
+ }
+
+ return treeRange;
+ }
+
public abstract Object getValue();
public abstract boolean isImmediate();
@@ -217,13 +217,6 @@
}
@Override
- protected ExtendedDataModel<?> createExtendedDataModel() {
- ExtendedTreeDataModelImpl<?> model = new
ExtendedTreeDataModelImpl<TreeNode>(new SwingTreeNodeDataModelImpl());
- model.setWrappedData(getValue());
- return model;
- }
-
- @Override
protected DataComponentState createComponentState() {
// TODO Auto-generated method stub
return null;
@@ -403,11 +396,6 @@
}
}
- @Override
- public DataComponentState getComponentState() {
- return new TreeComponentState();
- }
-
public void addTreeSelectionChangeListener(TreeSelectionChangeListener listener) {
addFacesListener(listener);
}
@@ -448,12 +436,87 @@
return treeNode.isExpanded();
}
+ //TODO review
+ protected TreeDataModel<?> getTreeDataModel() {
+ return (TreeDataModel<?>) getExtendedDataModel();
+ }
+
@Attribute(hidden = true)
public boolean isLeaf() {
if (getRowKey() == null) {
return false;
}
- return ((TreeDataModel<?>) getExtendedDataModel()).isLeaf();
+ return getTreeDataModel().isLeaf();
}
+
+ @Override
+ public void walk(final FacesContext faces, final DataVisitor visitor, final Object
argument) {
+ walkModel(faces, new TreeDataVisitor() {
+
+ public void enterNode() {
+ visitor.process(faces, getRowKey(), argument);
+ }
+
+ public void exitNode() {
+ }
+
+ });
+ }
+
+ @Override
+ protected ExtendedDataModel<?> createExtendedDataModel() {
+ SwingTreeNodeDataModelImpl dataModel = new SwingTreeNodeDataModelImpl();
+ dataModel.setWrappedData(getValue());
+ return dataModel;
+ }
+
+ public void walkModel(FacesContext context, TreeDataVisitor dataVisitor) {
+ TreeDataModel<?> model = getTreeDataModel();
+
+ if (!getTreeRange().shouldProcessNode()) {
+ return;
+ }
+
+ boolean isRootNode = (getRowKey() == null);
+
+ if (!isRootNode) {
+ dataVisitor.enterNode();
+ }
+
+ walkModelChildren(context, dataVisitor, model);
+
+ if (!isRootNode) {
+ dataVisitor.exitNode();
+ }
+ }
+
+ private void walkModelChildren(FacesContext context, TreeDataVisitor dataVisitor,
TreeDataModel<?> model) {
+ if (!getTreeRange().shouldIterateChildren()) {
+ return;
+ }
+
+ Iterator<TreeDataModelTuple> childrenTuples = model.children();
+ while (childrenTuples.hasNext()) {
+ TreeDataModelTuple tuple = childrenTuples.next();
+
+ setRowKeyAndData(context, tuple.getRowKey(), tuple.getData());
+
+ if (!getTreeRange().shouldProcessNode()) {
+ continue;
+ }
+
+ dataVisitor.enterNode();
+
+ walkModelChildren(context, dataVisitor, model);
+
+ dataVisitor.exitNode();
+ }
+ }
+
+ @Override
+ protected void resetDataModel() {
+ super.resetDataModel();
+ treeRange = null;
+ }
}
Modified: trunk/ui/iteration/ui/src/main/java/org/richfaces/component/TreeRange.java
===================================================================
--- trunk/ui/iteration/ui/src/main/java/org/richfaces/component/TreeRange.java 2010-11-29
20:14:12 UTC (rev 20212)
+++ trunk/ui/iteration/ui/src/main/java/org/richfaces/component/TreeRange.java 2010-11-29
20:28:16 UTC (rev 20213)
@@ -21,8 +21,6 @@
*/
package org.richfaces.component;
-import javax.faces.context.FacesContext;
-
import org.ajax4jsf.model.Range;
/**
@@ -31,26 +29,27 @@
*/
public class TreeRange implements Range {
- private FacesContext facesContext;
-
private AbstractTree tree;
private boolean traverseAll;
- public TreeRange(FacesContext facesContext, AbstractTree tree) {
+ public TreeRange(AbstractTree tree) {
super();
- this.facesContext = facesContext;
this.tree = tree;
traverseAll = (SwitchType.client == tree.getToggleType());
}
- public boolean shouldIterateChildren(Object rowKey) {
- if (traverseAll) {
- return true;
+ public boolean shouldProcessNode() {
+ return tree.findTreeNodeComponent() != null;
+ }
+
+ public boolean shouldIterateChildren() {
+ if (tree.isLeaf()) {
+ return false;
}
- return !tree.isLeaf() && tree.isExpanded();
+ return traverseAll || tree.isExpanded();
}
}
Deleted:
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-29
20:14:12 UTC (rev 20212)
+++
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/ExtendedTreeDataModelImpl.java 2010-11-29
20:28:16 UTC (rev 20213)
@@ -1,133 +0,0 @@
-/*
- * 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.context.FacesContext;
-
-import org.ajax4jsf.model.DataVisitor;
-import org.ajax4jsf.model.ExtendedDataModel;
-import org.ajax4jsf.model.Range;
-
-/**
- * @author Nick Belaevski
- *
- */
-public class ExtendedTreeDataModelImpl<E> extends ExtendedDataModel<E>
implements TreeDataModel<E> {
-
- private TreeDataModel<E> wrappedModel;
-
- public ExtendedTreeDataModelImpl(TreeDataModel<E> wrappedModel) {
- super();
- this.wrappedModel = wrappedModel;
- }
-
- public boolean isDataAvailable() {
- return wrappedModel.isDataAvailable();
- }
-
- public E getData() {
- return wrappedModel.getData();
- }
-
- public Object getParentRowKey(Object rowKey) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void setRowKey(Object key) {
- wrappedModel.setRowKey(key);
- }
-
- @Override
- public Object getRowKey() {
- return wrappedModel.getRowKey();
- }
-
- @Override
- public void walk(FacesContext context, DataVisitor visitor, Range range, Object
argument) {
- wrappedModel.enterNode(visitor);
- wrappedModel.walk(context, visitor, range, argument);
- wrappedModel.exitNode(visitor);
- }
-
- @Override
- public boolean isRowAvailable() {
- return wrappedModel.isDataAvailable();
- }
-
- @Override
- public int getRowCount() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public E getRowData() {
- return wrappedModel.getData();
- }
-
- @Override
- public int getRowIndex() {
- throw new UnsupportedOperationException();
- }
-
- public void setRowIndex(int rowIndex) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public Object getWrappedData() {
- return wrappedModel.getWrappedData();
- }
-
- @Override
- public void setWrappedData(Object data) {
- wrappedModel.setWrappedData(data);
- }
-
- /* (non-Javadoc)
- * @see org.richfaces.model.TreeDataModel#isLeaf()
- */
- public boolean isLeaf() {
- // TODO Auto-generated method stub
- return wrappedModel.isLeaf();
- }
-
- /* (non-Javadoc)
- * @see org.richfaces.model.TreeDataModel#enterNode(org.ajax4jsf.model.DataVisitor)
- */
- public void enterNode(DataVisitor visitor) {
- // TODO Auto-generated method stub
-
- wrappedModel.enterNode(visitor);
- }
-
- /* (non-Javadoc)
- * @see org.richfaces.model.TreeDataModel#exitNode(org.ajax4jsf.model.DataVisitor)
- */
- public void exitNode(DataVisitor visitor) {
- // TODO Auto-generated method stub
-
- wrappedModel.exitNode(visitor);
- }
-
-
-}
Deleted:
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/SequenceRowKeyIterator.java
===================================================================
---
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/SequenceRowKeyIterator.java 2010-11-29
20:14:12 UTC (rev 20212)
+++
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/SequenceRowKeyIterator.java 2010-11-29
20:28:16 UTC (rev 20213)
@@ -1,98 +0,0 @@
-/*
- * 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 java.util.Iterator;
-
-import com.google.common.base.Objects;
-import com.google.common.base.Objects.ToStringHelper;
-
-/**
- * @author Nick Belaevski
- *
- */
-public abstract class SequenceRowKeyIterator<K, T> implements
Iterator<Object> {
-
- private SequenceRowKey<K> baseKey;
-
- private Iterator<T> itr;
-
- private T element;
-
- private SequenceRowKey<K> elementKey;
-
- private T baseElement;
-
- public SequenceRowKeyIterator(SequenceRowKey<K> baseKey, T baseElement,
Iterator<T> itr) {
- super();
- this.baseKey = baseKey;
- this.baseElement = baseElement;
- this.itr = itr;
- }
-
- public boolean hasNext() {
- return itr.hasNext();
- }
-
- protected abstract K nextKey();
-
- public Object next() {
- element = itr.next();
-
- if (baseKey != null) {
- elementKey = baseKey.append(nextKey());
- } else {
- elementKey = new SequenceRowKey<K>(nextKey());
- }
-
- return elementKey;
- }
-
- public T getElement() {
- return element;
- }
-
- public SequenceRowKey<K> getBaseKey() {
- return baseKey;
- }
-
- public T getBaseElement() {
- return baseElement;
- }
-
- public SequenceRowKey<K> getElementKey() {
- return elementKey;
- }
-
- public void remove() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public String toString() {
- ToStringHelper helper = Objects.toStringHelper(this);
-
- helper.add("element", element).add("elementKey",
elementKey);
-
- return helper.toString();
- }
-}
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:14:12 UTC (rev 20212)
+++
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/SwingTreeNodeDataModelImpl.java 2010-11-29
20:28:16 UTC (rev 20213)
@@ -38,35 +38,49 @@
*/
public class SwingTreeNodeDataModelImpl extends TreeSequenceKeyModel<Integer,
TreeNode> {
- /**
- * @author Nick Belaevski
- *
- */
- private static final class SwingTreeNodeRowKeyIterator extends
SequenceRowKeyIterator<Integer, TreeNode> {
+ private final class SwingTreeNodeRowKeyIterator implements
Iterator<TreeDataModelTuple> {
+
+ private SequenceRowKey<Integer> baseKey;
+ private Iterator<TreeNode> children;
+
private int counter = 0;
- /**
- * @param baseKey
- * @param baseElement
- * @param itr
- */
- private SwingTreeNodeRowKeyIterator(SequenceRowKey<Integer> baseKey,
TreeNode baseElement,
- Iterator<TreeNode> itr) {
- super(baseKey, baseElement, itr);
+ private SwingTreeNodeRowKeyIterator(SequenceRowKey<Integer> baseKey,
Iterator<TreeNode> children) {
+ this.baseKey = baseKey;
+ this.children = children;
}
- @Override
- protected Integer nextKey() {
+ private int getNextCounterValue() {
return counter++;
}
+
+ public boolean hasNext() {
+ return children.hasNext();
+ }
+
+ public TreeDataModelTuple next() {
+ TreeNode node = children.next();
+
+ SequenceRowKey<Integer> key;
+
+ if (baseKey != null) {
+ key = baseKey.append(getNextCounterValue());
+ } else {
+ key = new SequenceRowKey<Integer>(getNextCounterValue());
+ }
+
+ setRowKeyAndData(key, node);
+
+ return new TreeDataModelTuple(key, node);
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+
}
-
- /**
- * @author Nick Belaevski
- *
- */
private final class FakeRootNode implements TreeNode {
private Collection<TreeNode> wrappedData;
@@ -125,7 +139,9 @@
}
}
- private Iterator<TreeNode> safeGetChildren(SequenceRowKey<Integer> key,
TreeNode treeNode) {
+ private boolean asksAllowsChildren = false;
+
+ private Iterator<TreeNode> safeGetChildren(TreeNode treeNode) {
if (treeNode == null) {
return Iterators.emptyIterator();
}
@@ -138,16 +154,6 @@
throw new UnsupportedOperationException();
}
- public boolean isLeaf() {
- if (!isDataAvailable()) {
- throw new IllegalStateException();
- }
-
- TreeNode treeNode = getData();
-
- return !treeNode.getAllowsChildren() || treeNode.isLeaf();
- }
-
public void setWrappedData(Object data) {
setRootNode(new FakeRootNode((Collection<TreeNode>) data));
}
@@ -170,11 +176,16 @@
return null;
}
+ public Iterator<TreeDataModelTuple> children() {
+ return new SwingTreeNodeRowKeyIterator(getRowKey(), safeGetChildren(getData()));
+ }
- @Override
- protected SequenceRowKeyIterator<Integer, TreeNode>
createChildrenIterator(SequenceRowKey<Integer> baseKey,
- TreeNode value) {
-
- return new SwingTreeNodeRowKeyIterator(baseKey, value, safeGetChildren(baseKey,
value));
+
+ public boolean isLeaf() {
+ if (!asksAllowsChildren) {
+ return getData().isLeaf();
+ } else {
+ return !getData().getAllowsChildren();
+ }
}
-}
+}
\ 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:14:12 UTC (rev 20212)
+++
trunk/ui/iteration/ui/src/main/java/org/richfaces/model/TreeSequenceKeyModel.java 2010-11-29
20:28:16 UTC (rev 20213)
@@ -21,85 +21,58 @@
*/
package org.richfaces.model;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.ListIterator;
-
import javax.faces.context.FacesContext;
import org.ajax4jsf.model.DataVisitor;
+import org.ajax4jsf.model.ExtendedDataModel;
import org.ajax4jsf.model.Range;
-import org.richfaces.component.TreeRange;
+
/**
* @author Nick Belaevski
*
*/
-public abstract class TreeSequenceKeyModel<K, V> implements TreeDataModel<V>
{
+public abstract class TreeSequenceKeyModel<K, V> extends ExtendedDataModel<V>
implements TreeDataModel<V> {
private V rootNode;
- private V currentData;
+ private V data;
- private SequenceRowKey<K> currentRowKey;
+ private SequenceRowKey<K> rowKey;
- private LinkedList<SequenceRowKeyIterator<K, V>> keysStack = new
LinkedList<SequenceRowKeyIterator<K, V>>();
-
public SequenceRowKey<K> getRowKey() {
- return currentRowKey;
+ return rowKey;
}
public void setRowKey(Object rowKey) {
- this.currentRowKey = (SequenceRowKey<K>) rowKey;
- this.currentData = findData(currentRowKey);
+ if (this.rowKey == null || !this.rowKey.equals(rowKey)) {
+ this.rowKey = (SequenceRowKey<K>) rowKey;
+ this.data = findData(this.rowKey);
+ }
}
+ protected void setRowKeyAndData(SequenceRowKey<K> key, V data) {
+ this.rowKey = key;
+ this.data = data;
+ }
+
public boolean isDataAvailable() {
- return currentRowKey == null || currentData != null;
+ return data != null;
}
- public abstract boolean isLeaf();
-
public V getData() {
if (!isDataAvailable()) {
throw new IllegalArgumentException();
}
- return currentData;
+ return data;
}
- protected boolean isRootNodeKey(SequenceRowKey<K> key) {
- return key == null || key.getLastKeySegment() == null;
- }
-
protected V findData(SequenceRowKey<K> key) {
if (key == null) {
return rootNode;
}
- if (!keysStack.isEmpty()) {
- ListIterator<SequenceRowKeyIterator<K, V>> listIterator =
keysStack.listIterator(keysStack.size());
-
- while (listIterator.hasPrevious()) {
- SequenceRowKeyIterator<K, V> previous = listIterator.previous();
-
- V baseNode = null;
-
- SequenceRowKey<K> baseKey = previous.getBaseKey();
- if (isRootNodeKey(baseKey) && isRootNodeKey(key.getParent())) {
- baseNode = rootNode;
- } else if (baseKey.equals(key.getParent())) {
- baseNode = previous.getBaseElement();
- }
-
- if (baseNode == null) {
- continue;
- }
-
- return findChild(baseNode, key.getLastKeySegment());
- }
- }
-
V result = rootNode;
for (K simpleKey : key.getSimpleKeys()) {
@@ -115,54 +88,47 @@
protected abstract V findChild(V parent, K simpleKey);
- protected abstract SequenceRowKeyIterator<K, V>
createChildrenIterator(SequenceRowKey<K> baseKey, V value);
+ protected V getRootNode() {
+ return rootNode;
+ }
- public void enterNode(DataVisitor visitor) {
- SequenceRowKey<K> sequenceKey = getRowKey();
- V data = findData(sequenceKey);
-
- keysStack.addLast(createChildrenIterator(sequenceKey, data));
+ protected void setRootNode(V rootNode) {
+ this.rootNode = rootNode;
+ }
+
+ //TODO ExtendedDataModel legacy
+ @Override
+ public void walk(FacesContext context, DataVisitor visitor, Range range, Object
argument) {
+ throw new UnsupportedOperationException();
+ }
- if (visitor instanceof TreeDataVisitor) {
- ((TreeDataVisitor) visitor).enterNode();
- }
+
+ @Override
+ public boolean isRowAvailable() {
+ return isDataAvailable();
}
- public void walk(FacesContext context, DataVisitor visitor, Range range, Object
argument) {
- if (getRowKey() != null) {
- visitor.process(context, getRowKey(), argument);
- }
- TreeRange treeRange = (TreeRange) range;
-
- if (treeRange.shouldIterateChildren(getRowKey())) {
- enterNode(visitor);
- Iterator<Object> keysIterator = keysStack.getLast();
- while (keysIterator.hasNext()) {
- Object key = (Object) keysIterator.next();
- setRowKey(key);
- walk(context, visitor, range, argument);
- }
- exitNode(visitor);
- }
+ @Override
+ public int getRowCount() {
+ throw new UnsupportedOperationException();
}
- public void exitNode(DataVisitor visitor) {
- if (visitor instanceof TreeDataVisitor) {
- ((TreeDataVisitor) visitor).exitNode();
- }
- keysStack.removeLast();
+ @Override
+ public V getRowData() {
+ return getData();
}
- public abstract Object getParentRowKey(Object rowKey);
- protected V getRootNode() {
- return rootNode;
+ @Override
+ public int getRowIndex() {
+ throw new UnsupportedOperationException();
}
-
- protected void setRootNode(V rootNode) {
- this.rootNode = rootNode;
+
+
+ @Override
+ public void setRowIndex(int rowIndex) {
+ throw new UnsupportedOperationException();
}
-
}
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:14:12 UTC (rev 20212)
+++
trunk/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeEncoderBase.java 2010-11-29
20:28:16 UTC (rev 20213)
@@ -22,20 +22,16 @@
package org.richfaces.renderkit;
import java.io.IOException;
-import java.util.LinkedList;
-import javax.faces.FacesException;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import org.ajax4jsf.context.AjaxContext;
import org.ajax4jsf.javascript.JSFunction;
-import org.ajax4jsf.model.DataVisitResult;
import org.richfaces.component.AbstractTree;
import org.richfaces.component.AbstractTreeNode;
import org.richfaces.component.util.HtmlUtil;
import org.richfaces.model.TreeDataVisitor;
-import org.richfaces.renderkit.TreeRendererBase.QueuedData;
abstract class TreeEncoderBase implements TreeDataVisitor {
@@ -47,10 +43,6 @@
protected final AbstractTree tree;
- private LinkedList<QueuedData> queuedDataList = new
LinkedList<QueuedData>();
-
- private QueuedData queuedData;
-
public TreeEncoderBase(FacesContext context, AbstractTree tree) {
super();
this.context = context;
@@ -59,87 +51,36 @@
}
protected void encodeTree() throws IOException {
- tree.walk(context, this, null);
+ tree.walkModel(context, this);
}
- protected void flushNode() throws IOException {
- if (!queuedData.isEncoded()) {
- tree.setRowKey(context, queuedData.getRowKey());
-
- TreeNodeState state;
- if (tree.isLeaf()) {
- state = TreeNodeState.leaf;
+ public void enterNode() {
+ TreeNodeState state;
+ if (tree.isLeaf()) {
+ state = TreeNodeState.leaf;
+ } else {
+ if (tree.isExpanded()) {
+ state = TreeNodeState.expanded;
} else {
- if (queuedData.isVisited()) {
- state = TreeNodeState.leaf;
- } else {
- state = TreeNodeState.collapsed;
- }
+ state = TreeNodeState.collapsed;
}
-
- writeTreeNodeStartElement(state);
}
-
- writeTreeNodeEndElement();
- }
-
- protected void flushParentNode() throws IOException {
- if (queuedDataList.isEmpty()) {
- return;
- }
- QueuedData data = queuedDataList.getLast();
- if (!data.isEncoded()) {
- data.setEncoded(true);
- tree.setRowKey(context, data.getRowKey());
-
- writeTreeNodeStartElement(tree.isExpanded() ? TreeNodeState.expanded :
TreeNodeState.collapsed);
- }
- }
-
- public void enterNode() {
- if (queuedData != null) {
- queuedData.makeVisited();
- queuedDataList.add(queuedData);
- queuedData = null;
- }
- }
-
- public DataVisitResult process(FacesContext context, Object rowKey, Object argument)
{
try {
- if (queuedData != null) {
- flushNode();
- queuedData = null;
- } else {
- flushParentNode();
- }
+ writeTreeNodeStartElement(state);
+ tree.findTreeNodeComponent().encodeAll(context);
} catch (IOException e) {
- throw new FacesException(e.getMessage(), e);
+ // TODO Auto-generated catch block
+ e.printStackTrace();
}
-
- if (rowKey != null) {
- tree.setRowKey(context, rowKey);
-
- if (tree.isRowAvailable() && tree.findTreeNodeComponent() != null) {
- queuedData = new QueuedData(rowKey);
- }
- }
-
- return DataVisitResult.CONTINUE;
}
-
+
public void exitNode() {
try {
- if (queuedData != null) {
- flushNode();
- queuedData = null;
- }
-
- if (!queuedDataList.isEmpty()) {
- queuedData = queuedDataList.removeLast();
- }
+ writeTreeNodeEndElement();
} catch (IOException e) {
- throw new FacesException(e.getMessage(), e);
+ // TODO Auto-generated catch block
+ e.printStackTrace();
}
}
@@ -155,7 +96,6 @@
responseWriter.writeAttribute(HtmlConstants.ID_ATTRIBUTE,
treeNodeComponent.getClientId(context), null);
emitClientToggleEvent(treeNodeComponent, nodeState);
- treeNodeComponent.encodeAll(context);
}
protected void writeTreeNodeEndElement() throws IOException {
Modified:
trunk/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeRendererBase.java
===================================================================
---
trunk/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeRendererBase.java 2010-11-29
20:14:12 UTC (rev 20212)
+++
trunk/ui/iteration/ui/src/main/java/org/richfaces/renderkit/TreeRendererBase.java 2010-11-29
20:28:16 UTC (rev 20213)
@@ -84,39 +84,6 @@
}
}
- static final class QueuedData {
-
- private Object rowKey;
-
- private boolean encoded;
-
- private boolean visited;
-
- public QueuedData(Object rowKey) {
- this.rowKey = rowKey;
- }
-
- public void setEncoded(boolean encoded) {
- this.encoded = encoded;
- }
-
- public boolean isEncoded() {
- return encoded;
- }
-
- public Object getRowKey() {
- return rowKey;
- }
-
- public boolean isVisited() {
- return visited;
- }
-
- public void makeVisited() {
- visited = true;
- }
- }
-
public void encodeTree(FacesContext context, UIComponent component) throws
IOException {
AbstractTree tree = (AbstractTree) component;