You are viewing a plain text version of this content. The canonical link for it is here.
Posted to adffaces-commits@incubator.apache.org by aw...@apache.org on 2006/06/30 22:50:35 UTC
svn commit: r418405 - in
/incubator/adffaces/trunk/adf-faces/adf-faces-api/src/main:
java-templates/org/apache/myfaces/adf/component/
java/org/apache/myfaces/adf/component/
Author: awiner
Date: Fri Jun 30 15:50:35 2006
New Revision: 418405
URL: http://svn.apache.org/viewvc?rev=418405&view=rev
Log:
ADFFACES-18: In TableTree component, column's header facet doesn't run action invocation and update values of it's children.
Modified:
incubator/adffaces/trunk/adf-faces/adf-faces-api/src/main/java-templates/org/apache/myfaces/adf/component/UIXTableTemplate.java
incubator/adffaces/trunk/adf-faces/adf-faces-api/src/main/java-templates/org/apache/myfaces/adf/component/UIXTreeTableTemplate.java
incubator/adffaces/trunk/adf-faces/adf-faces-api/src/main/java/org/apache/myfaces/adf/component/TableUtils.java
Modified: incubator/adffaces/trunk/adf-faces/adf-faces-api/src/main/java-templates/org/apache/myfaces/adf/component/UIXTableTemplate.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/trunk/adf-faces/adf-faces-api/src/main/java-templates/org/apache/myfaces/adf/component/UIXTableTemplate.java?rev=418405&r1=418404&r2=418405&view=diff
==============================================================================
--- incubator/adffaces/trunk/adf-faces/adf-faces-api/src/main/java-templates/org/apache/myfaces/adf/component/UIXTableTemplate.java (original)
+++ incubator/adffaces/trunk/adf-faces/adf-faces-api/src/main/java-templates/org/apache/myfaces/adf/component/UIXTableTemplate.java Fri Jun 30 15:50:35 2006
@@ -1,357 +1,357 @@
-/*
- * Copyright 2003-2006 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.myfaces.adf.component;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.faces.component.UIComponent;
-import javax.faces.context.FacesContext;
-import javax.faces.el.MethodBinding;
-import javax.faces.event.AbortProcessingException;
-import javax.faces.event.FacesEvent;
-import javax.faces.event.PhaseId;
-
-import org.apache.myfaces.adf.event.RowDisclosureEvent;
-import org.apache.myfaces.adf.event.RangeChangeEvent;
-import org.apache.myfaces.adf.event.SelectionEvent;
-import org.apache.myfaces.adf.event.SortEvent;
-import org.apache.myfaces.adf.model.CollectionModel;
-import org.apache.myfaces.adf.model.RowKeySet;
-import org.apache.myfaces.adf.model.RowKeySetImpl;
-
-/**
- * Base class for the Table component. The behaviour supported by this base class
- * include record navigation, sorting, selection and detail-disclosure.
- * <p>
- * @version $Name: $ ($Revision: adfrt/faces/adf-faces-api/src/main/java-templates/oracle/adf/view/faces/component/UIXTableTemplate.java#0 $) $Date: 10-nov-2005.19:07:51 $
- * @author The Oracle ADF Faces Team
- */
-abstract public class UIXTableTemplate extends UIXIteratorTemplate
- implements CollectionComponent
-{
-
- public void setSortCriteria(List criteria)
- {
- _sortCriteria = criteria;
- super.setSortCriteria(criteria);
- }
-
- /**
- * Sets the phaseID of UI events depending on the "immediate" property.
- */
- public void queueEvent(FacesEvent event)
- {
- TableUtils.__handleQueueEvent(this, event);
- super.queueEvent(event);
- }
-
- /**
- * Delivers an event to the appropriate listeners.
- * @param event
- * @throws javax.faces.event.AbortProcessingException
- */
- public void broadcast(FacesEvent event)
- throws AbortProcessingException
- {
- // the order of processing is
- // 1. do any default action handling
- // 2. invoke any actionListener method binding
- // 3. call all the registered ActionListener instances.
-
- // Deliver to the default RangeChangeListener
- if (event instanceof RangeChangeEvent)
- {
- RangeChangeEvent rEvent = (RangeChangeEvent) event;
- int first = rEvent.getNewStart();
- setFirst(first);
- //pu: Implicitly record a Change for 'first' attribute
- addAttributeChange("first", new Integer(first));
-
- if ((first == 0) && (rEvent.getNewEnd() == getRowCount()))
- {
- setShowAll(true);
- //pu: Implicitly record a Change for 'showAll' attribute
- addAttributeChange("showAll", Boolean.TRUE);
- }
- else if (isShowAll())
- {
- setShowAll(false);
- //pu: Implicitly record a Change for 'showAll' attribute
- addAttributeChange("showAll", Boolean.FALSE);
- }
-
- __broadcast(event, getRangeChangeListener());
- }
- else if (event instanceof RowDisclosureEvent)
- {
- RowDisclosureEvent eEvent = (RowDisclosureEvent) event;
- RowKeySet set = getDisclosedRowKeys();
- set.addAll(eEvent.getAddedSet());
- set.removeAll(eEvent.getRemovedSet());
- __broadcast(event, getRowDisclosureListener());
- }
- else if (event instanceof SortEvent)
- {
- SortEvent sEvent = (SortEvent) event;
- setSortCriteria(sEvent.getSortCriteria());
- __broadcast(event, getSortListener());
- }
- else if (event instanceof SelectionEvent)
- {
- //pu: Implicitly record a Change for 'selectionState' attribute
- addAttributeChange("selectedRowKeys",
- getSelectedRowKeys());
- __broadcast(event, getSelectionListener());
- }
-
- super.broadcast(event);
- }
-
-
-/**/ abstract public void setDisclosedRowKeys(RowKeySet state);
-/**/ abstract public RowKeySet getDisclosedRowKeys();
-/**/ public abstract RowKeySet getSelectedRowKeys();
-/**/ public abstract void setSelectedRowKeys(RowKeySet model);
-/**/ abstract public void setFirst(int first);
-/**/ abstract public void setShowAll(boolean showAll);
-/**/ abstract public boolean isShowAll();
-/**/ abstract public UIComponent getDetailStamp();
-/**/ public abstract MethodBinding getRangeChangeListener();
-/**/ public abstract MethodBinding getSortListener();
-/**/ public abstract MethodBinding getRowDisclosureListener();
-/**/ public abstract MethodBinding getSelectionListener();
-/**/ public abstract boolean isImmediate();
-
- public Object saveState(FacesContext context)
- {
- Object o = super.saveState(context);
- if ((o == null) &&
- ((_sortCriteria == null) || _sortCriteria.isEmpty()))
- return null;
-
- return new Object[]{o, _sortCriteria};
- }
-
- public void restoreState(FacesContext context, Object state)
- {
- Object[] array = (Object[]) state;
- super.restoreState(context, array[0]);
-
-
- // Get the sort criteria - but *don't* call setSortCriteria()
- // here; doing so would require getting the collection model,
- // and that may invoke client code that isn't quite in a state
- // to be invoked, in part because component "binding"s have not been
- // evaluated yet.
- List criteria = (List) array[1];
- _sortCriteria = criteria;
- }
-
-
- /**
- * Gets the data for the first selected row.
- * This is useful when using EL to get at column data for the selected
- * row when using a tableSelectOne.
- * @return null if there is nothing selected in the table.
- */
- public Object getSelectedRowData()
- {
- RowKeySet state = getSelectedRowKeys();
- Iterator keys = state.iterator();
- if (keys.hasNext())
- {
- Object key = keys.next();
- CollectionModel model = getCollectionModel();
- Object old = model.getRowKey();
- try
- {
- model.setRowKey(key);
- return model.getRowData();
- }
- finally
- {
- model.setRowKey(old);
- }
- }
- return null;
- }
-
- protected final void processFacetsAndChildren(
- FacesContext context,
- PhaseId phaseId)
- {
- // process all the facets of this table just once
- // (except for the "detailStamp" facet which must be processed once
- // per row):
- TableUtils.__processFacets(context, this, this, phaseId,
- UIXTable.DETAIL_STAMP_FACET);
-
- // process all the facets of this table's column children:
- TableUtils.__processColumnFacets(context, this, this, phaseId);
-
- // process all the children and the detailStamp as many times as necessary
- _processStamps(context, phaseId);
- }
-
- /**
- * Gets the stamps. This returns the children of this component plus
- * the detail stamp (if any).
- * @todo cache the result.
- */
- protected final List getStamps()
- {
- List children = super.getStamps();
- UIComponent detail = getDetailStamp();
- if (detail != null)
- {
- List stamps = new ArrayList(children.size() + 1);
- stamps.addAll(children);
- stamps.add(detail);
- return stamps;
- }
- return children;
- }
-
- /**
- * Saves the state for the given stamp.
- * This method avoids changing the state of facets on columns.
- */
- protected final Object saveStampState(FacesContext context, UIComponent stamp)
- {
- if (stamp instanceof UIXColumn)
- {
- // if it is a column, we don't want the facets processed.
- // Only the children:
- return StampState.saveChildStampState(context, stamp, this);
- }
- else
- return super.saveStampState(context, stamp);
- }
-
- /**
- * Restores the state for the given stamp.
- * This method avoids changing the state of facets on columns.
- */
- protected final void restoreStampState(FacesContext context, UIComponent stamp,
- Object stampState)
- {
- if (stamp instanceof UIXColumn)
- {
- // if it is a column, we don't want the facets processed.
- // Only the children:
- StampState.restoreChildStampState(context, stamp, this, stampState);
- }
- else
- super.restoreStampState(context, stamp, stampState);
- }
-
- protected final CollectionModel createCollectionModel(
- CollectionModel current,
- Object value)
- {
- CollectionModel model = super.createCollectionModel(current, value);
-
- getSelectedRowKeys().setCollectionModel(model);
- getDisclosedRowKeys().setCollectionModel(model);
-
- // If we were perviously sorted, restore the sort order:
- if (_sortCriteria != null)
- {
- model.setSortCriteria(_sortCriteria);
- }
-
- return model;
- }
-
- /**
- * Gets the internal state of this component.
- */
- Object __getMyStampState()
- {
- Object[] state = new Object[6];
- state[0] = _sortCriteria;
- state[1] = super.__getMyStampState();
- state[2] = new Integer(getFirst());
- state[3] = Boolean.valueOf(isShowAll());
- state[4] = getSelectedRowKeys();
- state[5] = getDisclosedRowKeys();
- return state;
- }
-
- /**
- * Sets the internal state of this component.
- * @param stampState the internal state is obtained from this object.
- */
- void __setMyStampState(Object stampState)
- {
- Object[] state = (Object[]) stampState;
- _sortCriteria = (List) state[0];
- super.__setMyStampState(state[1]);
- setFirst(((Integer) state[2]).intValue());
- setShowAll(Boolean.TRUE == state[3]);
- setSelectedRowKeys((RowKeySet) state[4]);
- setDisclosedRowKeys((RowKeySet) state[5]);
- }
-
- private void _processStamps(
- FacesContext context,
- PhaseId phaseId)
- {
- // Process all the children
- CollectionModel tableData = getCollectionModel();
- if (tableData.getRowCount() != 0)
- {
- int startIndex = getFirst();
- int endIndex = isShowAll() ? getRowCount()-1 : TableUtils.getLast(this);
-
- UIComponent detail = getDetailStamp();
- RowKeySet disclosureState =
- (detail == null) ? null : getDisclosedRowKeys();
-
- for (int i = startIndex; i <= endIndex; i++)
- {
- setRowIndex(i);
- TableUtils.__processStampedChildren(context, this, phaseId);
-
- if ((disclosureState != null) && disclosureState.isContained())
- {
- assert getRowIndex() == i;
- processComponent(context, detail, phaseId);
- }
- }
-
- setRowIndex(-1);
- }
- }
-
-
- void __init()
- {
- super.__init();
- if (getSelectedRowKeys() == null)
- setSelectedRowKeys(new RowKeySetImpl());
- if (getDisclosedRowKeys() == null)
- setDisclosedRowKeys(new RowKeySetImpl());
- // if "first" is valueBound, we can't deal with it changing
- // during the lifecycle. So stash it as a local value.
- // see bug 4537121:
- setFirst(getFirst());
- }
-
- transient private List _sortCriteria = null;
+/*
+ * Copyright 2003-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.myfaces.adf.component;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.el.MethodBinding;
+import javax.faces.event.AbortProcessingException;
+import javax.faces.event.FacesEvent;
+import javax.faces.event.PhaseId;
+
+import org.apache.myfaces.adf.event.RowDisclosureEvent;
+import org.apache.myfaces.adf.event.RangeChangeEvent;
+import org.apache.myfaces.adf.event.SelectionEvent;
+import org.apache.myfaces.adf.event.SortEvent;
+import org.apache.myfaces.adf.model.CollectionModel;
+import org.apache.myfaces.adf.model.RowKeySet;
+import org.apache.myfaces.adf.model.RowKeySetImpl;
+
+/**
+ * Base class for the Table component. The behaviour supported by this base class
+ * include record navigation, sorting, selection and detail-disclosure.
+ * <p>
+ * @version $Name: $ ($Revision: adfrt/faces/adf-faces-api/src/main/java-templates/oracle/adf/view/faces/component/UIXTableTemplate.java#0 $) $Date: 10-nov-2005.19:07:51 $
+ * @author The Oracle ADF Faces Team
+ */
+abstract public class UIXTableTemplate extends UIXIteratorTemplate
+ implements CollectionComponent
+{
+
+ public void setSortCriteria(List criteria)
+ {
+ _sortCriteria = criteria;
+ super.setSortCriteria(criteria);
+ }
+
+ /**
+ * Sets the phaseID of UI events depending on the "immediate" property.
+ */
+ public void queueEvent(FacesEvent event)
+ {
+ TableUtils.__handleQueueEvent(this, event);
+ super.queueEvent(event);
+ }
+
+ /**
+ * Delivers an event to the appropriate listeners.
+ * @param event
+ * @throws javax.faces.event.AbortProcessingException
+ */
+ public void broadcast(FacesEvent event)
+ throws AbortProcessingException
+ {
+ // the order of processing is
+ // 1. do any default action handling
+ // 2. invoke any actionListener method binding
+ // 3. call all the registered ActionListener instances.
+
+ // Deliver to the default RangeChangeListener
+ if (event instanceof RangeChangeEvent)
+ {
+ RangeChangeEvent rEvent = (RangeChangeEvent) event;
+ int first = rEvent.getNewStart();
+ setFirst(first);
+ //pu: Implicitly record a Change for 'first' attribute
+ addAttributeChange("first", new Integer(first));
+
+ if ((first == 0) && (rEvent.getNewEnd() == getRowCount()))
+ {
+ setShowAll(true);
+ //pu: Implicitly record a Change for 'showAll' attribute
+ addAttributeChange("showAll", Boolean.TRUE);
+ }
+ else if (isShowAll())
+ {
+ setShowAll(false);
+ //pu: Implicitly record a Change for 'showAll' attribute
+ addAttributeChange("showAll", Boolean.FALSE);
+ }
+
+ __broadcast(event, getRangeChangeListener());
+ }
+ else if (event instanceof RowDisclosureEvent)
+ {
+ RowDisclosureEvent eEvent = (RowDisclosureEvent) event;
+ RowKeySet set = getDisclosedRowKeys();
+ set.addAll(eEvent.getAddedSet());
+ set.removeAll(eEvent.getRemovedSet());
+ __broadcast(event, getRowDisclosureListener());
+ }
+ else if (event instanceof SortEvent)
+ {
+ SortEvent sEvent = (SortEvent) event;
+ setSortCriteria(sEvent.getSortCriteria());
+ __broadcast(event, getSortListener());
+ }
+ else if (event instanceof SelectionEvent)
+ {
+ //pu: Implicitly record a Change for 'selectionState' attribute
+ addAttributeChange("selectedRowKeys",
+ getSelectedRowKeys());
+ __broadcast(event, getSelectionListener());
+ }
+
+ super.broadcast(event);
+ }
+
+
+/**/ abstract public void setDisclosedRowKeys(RowKeySet state);
+/**/ abstract public RowKeySet getDisclosedRowKeys();
+/**/ public abstract RowKeySet getSelectedRowKeys();
+/**/ public abstract void setSelectedRowKeys(RowKeySet model);
+/**/ abstract public void setFirst(int first);
+/**/ abstract public void setShowAll(boolean showAll);
+/**/ abstract public boolean isShowAll();
+/**/ abstract public UIComponent getDetailStamp();
+/**/ public abstract MethodBinding getRangeChangeListener();
+/**/ public abstract MethodBinding getSortListener();
+/**/ public abstract MethodBinding getRowDisclosureListener();
+/**/ public abstract MethodBinding getSelectionListener();
+/**/ public abstract boolean isImmediate();
+
+ public Object saveState(FacesContext context)
+ {
+ Object o = super.saveState(context);
+ if ((o == null) &&
+ ((_sortCriteria == null) || _sortCriteria.isEmpty()))
+ return null;
+
+ return new Object[]{o, _sortCriteria};
+ }
+
+ public void restoreState(FacesContext context, Object state)
+ {
+ Object[] array = (Object[]) state;
+ super.restoreState(context, array[0]);
+
+
+ // Get the sort criteria - but *don't* call setSortCriteria()
+ // here; doing so would require getting the collection model,
+ // and that may invoke client code that isn't quite in a state
+ // to be invoked, in part because component "binding"s have not been
+ // evaluated yet.
+ List criteria = (List) array[1];
+ _sortCriteria = criteria;
+ }
+
+
+ /**
+ * Gets the data for the first selected row.
+ * This is useful when using EL to get at column data for the selected
+ * row when using a tableSelectOne.
+ * @return null if there is nothing selected in the table.
+ */
+ public Object getSelectedRowData()
+ {
+ RowKeySet state = getSelectedRowKeys();
+ Iterator keys = state.iterator();
+ if (keys.hasNext())
+ {
+ Object key = keys.next();
+ CollectionModel model = getCollectionModel();
+ Object old = model.getRowKey();
+ try
+ {
+ model.setRowKey(key);
+ return model.getRowData();
+ }
+ finally
+ {
+ model.setRowKey(old);
+ }
+ }
+ return null;
+ }
+
+ protected final void processFacetsAndChildren(
+ FacesContext context,
+ PhaseId phaseId)
+ {
+ // process all the facets of this table just once
+ // (except for the "detailStamp" facet which must be processed once
+ // per row):
+ TableUtils.__processFacets(context, this, this, phaseId,
+ UIXTable.DETAIL_STAMP_FACET);
+
+ // process all the facets of this table's column children:
+ TableUtils.__processColumnFacets(context, this, this, phaseId);
+
+ // process all the children and the detailStamp as many times as necessary
+ _processStamps(context, phaseId);
+ }
+
+ /**
+ * Gets the stamps. This returns the children of this component plus
+ * the detail stamp (if any).
+ * @todo cache the result.
+ */
+ protected final List getStamps()
+ {
+ List children = super.getStamps();
+ UIComponent detail = getDetailStamp();
+ if (detail != null)
+ {
+ List stamps = new ArrayList(children.size() + 1);
+ stamps.addAll(children);
+ stamps.add(detail);
+ return stamps;
+ }
+ return children;
+ }
+
+ /**
+ * Saves the state for the given stamp.
+ * This method avoids changing the state of facets on columns.
+ */
+ protected final Object saveStampState(FacesContext context, UIComponent stamp)
+ {
+ if (stamp instanceof UIXColumn)
+ {
+ // if it is a column, we don't want the facets processed.
+ // Only the children:
+ return StampState.saveChildStampState(context, stamp, this);
+ }
+ else
+ return super.saveStampState(context, stamp);
+ }
+
+ /**
+ * Restores the state for the given stamp.
+ * This method avoids changing the state of facets on columns.
+ */
+ protected final void restoreStampState(FacesContext context, UIComponent stamp,
+ Object stampState)
+ {
+ if (stamp instanceof UIXColumn)
+ {
+ // if it is a column, we don't want the facets processed.
+ // Only the children:
+ StampState.restoreChildStampState(context, stamp, this, stampState);
+ }
+ else
+ super.restoreStampState(context, stamp, stampState);
+ }
+
+ protected final CollectionModel createCollectionModel(
+ CollectionModel current,
+ Object value)
+ {
+ CollectionModel model = super.createCollectionModel(current, value);
+
+ getSelectedRowKeys().setCollectionModel(model);
+ getDisclosedRowKeys().setCollectionModel(model);
+
+ // If we were perviously sorted, restore the sort order:
+ if (_sortCriteria != null)
+ {
+ model.setSortCriteria(_sortCriteria);
+ }
+
+ return model;
+ }
+
+ /**
+ * Gets the internal state of this component.
+ */
+ Object __getMyStampState()
+ {
+ Object[] state = new Object[6];
+ state[0] = _sortCriteria;
+ state[1] = super.__getMyStampState();
+ state[2] = new Integer(getFirst());
+ state[3] = Boolean.valueOf(isShowAll());
+ state[4] = getSelectedRowKeys();
+ state[5] = getDisclosedRowKeys();
+ return state;
+ }
+
+ /**
+ * Sets the internal state of this component.
+ * @param stampState the internal state is obtained from this object.
+ */
+ void __setMyStampState(Object stampState)
+ {
+ Object[] state = (Object[]) stampState;
+ _sortCriteria = (List) state[0];
+ super.__setMyStampState(state[1]);
+ setFirst(((Integer) state[2]).intValue());
+ setShowAll(Boolean.TRUE == state[3]);
+ setSelectedRowKeys((RowKeySet) state[4]);
+ setDisclosedRowKeys((RowKeySet) state[5]);
+ }
+
+ private void _processStamps(
+ FacesContext context,
+ PhaseId phaseId)
+ {
+ // Process all the children
+ CollectionModel tableData = getCollectionModel();
+ if (tableData.getRowCount() != 0)
+ {
+ int startIndex = getFirst();
+ int endIndex = isShowAll() ? getRowCount()-1 : TableUtils.getLast(this);
+
+ UIComponent detail = getDetailStamp();
+ RowKeySet disclosureState =
+ (detail == null) ? null : getDisclosedRowKeys();
+
+ for (int i = startIndex; i <= endIndex; i++)
+ {
+ setRowIndex(i);
+ TableUtils.__processStampedChildren(context, this, phaseId);
+
+ if ((disclosureState != null) && disclosureState.isContained())
+ {
+ assert getRowIndex() == i;
+ processComponent(context, detail, phaseId);
+ }
+ }
+
+ setRowIndex(-1);
+ }
+ }
+
+
+ void __init()
+ {
+ super.__init();
+ if (getSelectedRowKeys() == null)
+ setSelectedRowKeys(new RowKeySetImpl());
+ if (getDisclosedRowKeys() == null)
+ setDisclosedRowKeys(new RowKeySetImpl());
+ // if "first" is valueBound, we can't deal with it changing
+ // during the lifecycle. So stash it as a local value.
+ // see bug 4537121:
+ setFirst(getFirst());
+ }
+
+ transient private List _sortCriteria = null;
}
Modified: incubator/adffaces/trunk/adf-faces/adf-faces-api/src/main/java-templates/org/apache/myfaces/adf/component/UIXTreeTableTemplate.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/trunk/adf-faces/adf-faces-api/src/main/java-templates/org/apache/myfaces/adf/component/UIXTreeTableTemplate.java?rev=418405&r1=418404&r2=418405&view=diff
==============================================================================
--- incubator/adffaces/trunk/adf-faces/adf-faces-api/src/main/java-templates/org/apache/myfaces/adf/component/UIXTreeTableTemplate.java (original)
+++ incubator/adffaces/trunk/adf-faces/adf-faces-api/src/main/java-templates/org/apache/myfaces/adf/component/UIXTreeTableTemplate.java Fri Jun 30 15:50:35 2006
@@ -257,6 +257,10 @@
UIComponent nodeStamp = getNodeStamp();
// process any facets of the nodeStamp column:
TableUtils.__processFacets(context, this, nodeStamp, phaseId, null);
+
+ // process all the facets of this table's column children:
+ TableUtils.__processColumnFacets(context, this, this, phaseId);
+
// recursively process any grandchild columns of the nodeStamp column:
TableUtils.__processColumnFacets(context, this, nodeStamp, phaseId);
Modified: incubator/adffaces/trunk/adf-faces/adf-faces-api/src/main/java/org/apache/myfaces/adf/component/TableUtils.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/trunk/adf-faces/adf-faces-api/src/main/java/org/apache/myfaces/adf/component/TableUtils.java?rev=418405&r1=418404&r2=418405&view=diff
==============================================================================
--- incubator/adffaces/trunk/adf-faces/adf-faces-api/src/main/java/org/apache/myfaces/adf/component/TableUtils.java (original)
+++ incubator/adffaces/trunk/adf-faces/adf-faces-api/src/main/java/org/apache/myfaces/adf/component/TableUtils.java Fri Jun 30 15:50:35 2006
@@ -13,309 +13,309 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.myfaces.adf.component;
-import java.util.List;
-import java.util.Map;
-
-import javax.faces.component.UIComponent;
-import javax.faces.context.FacesContext;
-import javax.faces.event.FacesEvent;
-import javax.faces.event.PhaseId;
-
-import org.apache.myfaces.adf.event.DisclosureEvent;
-import org.apache.myfaces.adf.event.RowDisclosureEvent;
-import org.apache.myfaces.adf.event.FocusEvent;
-import org.apache.myfaces.adf.event.RangeChangeEvent;
-import org.apache.myfaces.adf.event.SelectionEvent;
-import org.apache.myfaces.adf.event.SortEvent;
-import org.apache.myfaces.adf.model.ModelUtils;
-import org.apache.myfaces.adf.model.RowKeySet;
-import org.apache.myfaces.adf.model.TreeModel;
-
-/**
- * utility methods for dealing with tables.
- * @author The Oracle ADF Faces Team
- */
-public final class TableUtils
-{
-
- /**
- * Gets the index of the last visible row that should be
- * displayed by the given table. This is usually
- * {@link CollectionComponent#getFirst} added to
- * {@link CollectionComponent#getRows} minus 1, but it changes if
- * {@link CollectionComponent#getRowCount} returns
- * insufficient rows.
- * @return if this table is empty, this returns
- * {@link CollectionComponent#getFirst()} - 1
- */
- public static int getLast(CollectionComponent table)
- {
- return getLast(table, table.getFirst());
- }
-
- /**
- * Gets the index of the last visible row that should be
- * displayed by the given table. This is usually
- * rangeStart added to
- * {@link CollectionComponent#getRows} minus 1, but it changes if
- * {@link CollectionComponent#getRowCount} returns
- * insufficient rows.
- * @return if this table is empty, this returns
- * rangeStart - 1
- */
- public static int getLast(CollectionComponent table, int rangeStart)
- {
- final int rangeEnd;
- int blockSize = table.getRows();
- // if the blockSize is zero, that means show everthing.
- if (blockSize <= 0)
- {
- rangeEnd = Integer.MAX_VALUE;
- }
- else
- {
- rangeEnd = rangeStart + blockSize;
- }
- return ModelUtils.findLastIndex(table, rangeStart, rangeEnd) - 1;
- }
-
- /**
- * Sets up an EL variable on the requestScope.
- * @param name The name of the EL variable
- * @param value The value of the EL variable
- * @return any old value that was bound to the EL variable, or null
- * if there was no old value.
- */
- public static Object setupELVariable(FacesContext context, String name, Object value)
- {
- Map requestMap = context.getExternalContext().getRequestMap();
- if (value == null)
- return requestMap.remove(name);
- else
- return requestMap.put(name, value);
- }
-
- /**
- * Perform a safe expand all.
- * Checks to make sure that a complete expand-all operation won't result in
- * too many nodes being displayed to the user. If too many nodes will end
- * up being displayed, this method only expands the immediate children before
- * terminating. Otherwise, a complete expand-all operation is performed.
- * @param maxSize the maximum number of nodes to display. A complete expand-all
- * operation will not take place if more than this number of nodes
- * will end up being displayed.
- * @param model this tree model must have its path pointing to a particular
- * node which must be a container.
- */
- static void __doSafeExpandAll(TreeModel model, RowKeySet state, int maxSize)
- {
- int size = _getSizeOfTree(model, maxSize);
- if ((size < 0) || (size > maxSize))
- {
- // not safe to do expand all.
- // first expand the current node:
- state.add();
-
- // now only expand immediate children:
- model.enterContainer();
- int i=0;
- while(true)
- {
- model.setRowIndex(i++);
- if (!model.isRowAvailable())
- break;
- state.add();
- }
- model.exitContainer();
- }
- else // safe to do expand all:
- state.addAll();
- }
-
- /**
- * Computes the number of nodes in a subtree.
- * @param model the path must point to a node.
- * @param maxSize the maximum number of nodes that will be searched.
- * this method returns once this limit is reached.
- * @return -1 if the number of nodes is unknown.
- * If the limit is hit, then returns the number of nodes that are known
- * to exist at the time the limit was hit. This number may be larger than
- * maxSize.
- */
- static int _getSizeOfTree(TreeModel model, int maxSize)
- {
- if (model.isRowAvailable() && model.isContainer())
- {
- model.enterContainer();
- try
- {
- int size = model.getRowCount();
- for(int i=0, sz=size; i<sz; i++)
- {
- if (size > maxSize)
- return size;
- model.setRowIndex(i);
- int kidSize = _getSizeOfTree(model, maxSize - size);
- if (kidSize < 0)
- return -1;
- size += kidSize;
- }
- return size;
- }
- finally
- {
- model.exitContainer();
- }
- }
- return 0;
- }
-
- /**
- * This method sets the phaseID of the event
- * according to the "immediate" property of this
- * component.
- * If "immediate" is set to true, this calls
- * {@link FacesContext#renderResponse}
- */
- static void __handleQueueEvent(UIComponent comp, FacesEvent event)
- {
- if (_isImmediateEvent(comp, event))
- {
- String immediateAttr = UIXTree.IMMEDIATE_KEY.getName();
- Object isImmediate = comp.getAttributes().get(immediateAttr);
- if (Boolean.TRUE.equals(isImmediate))
- {
- event.setPhaseId(PhaseId.ANY_PHASE);
- FacesContext context = FacesContext.getCurrentInstance();
- context.renderResponse();
- }
- else
- {
- // the event should not execute before model updates are done.
- // otherwise, the updates will be done to the wrong rows.
-
- // we can't do this at the end of the UPDATE_MODEL phase because
- // if there are errors during that phase, then we want to immediately render
- // the response, and not deliver this ui event:
- event.setPhaseId(PhaseId.INVOKE_APPLICATION);
- }
- }
- }
-
- /**
- * Process all the facets of a component; these are
- * generally not processed once per row.
- * @param skipFacet the name of any facet that should not be processed
- * at this time.
- */
- static void __processFacets(
- FacesContext context,
- final UIXCollection table,
- UIComponent component,
- final PhaseId phaseId,
- String skipFacet)
- {
- Map facets = component.getFacets();
- final UIComponent skip = (skipFacet != null)
- ? (UIComponent) facets.get(skipFacet)
- : null;
-
- new ChildLoop()
- {
- protected void process(FacesContext context, UIComponent facet)
- {
- if (facet != skip)
- table.processComponent(context, facet, phaseId);
- }
- }.runAlways(context, facets.values());
- }
-
- /**
- * Process all the facets of any children that are columns; these are
- * generally not processed once per row.
- */
- static void __processColumnFacets(
- FacesContext context,
- final UIXCollection table,
- UIComponent column,
- final PhaseId phaseId)
- {
- new ChildLoop()
- {
- protected void process(FacesContext context, UIComponent child)
- {
- if (child instanceof UIXColumn)
- {
- // process any facets of the child column:
- __processFacets(context, table, child, phaseId, null);
- // recursively process the facets of any grandchild columns:
- __processColumnFacets(context, table, child, phaseId);
- }
- }
- }.runAlways(context, column);
- }
-
- /**
- * Process all the children of the given table
- */
- static void __processStampedChildren(
- FacesContext context,
- final UIXCollection table,
- final PhaseId phaseId)
- {
- new ChildLoop()
- {
- protected void process(FacesContext context, UIComponent child)
- {
- table.processComponent(context, child, phaseId);
- }
- }.runAlways(context, table);
- }
-
- /**
- * Process all the children of the given table
- */
- static void __processChildren(
- FacesContext context,
- final UIXCollection comp,
- final PhaseId phaseId)
- {
-
- // process the children
- int childCount = comp.getChildCount();
- if (childCount != 0)
- {
- List children = comp.getChildren();
-
- for (int i = 0; i < childCount; i++)
- {
- UIComponent child = (UIComponent)children.get(i);
- comp.processComponent(context, child, phaseId);
- }
- }
- }
-
- /**
- * Checks to see if the given event could possible be affected by the
- * "immediate" property of the given component.
- */
- private static boolean _isImmediateEvent(UIComponent comp, FacesEvent event)
- {
- if (event.getComponent() == comp)
- {
- return
- (event instanceof RangeChangeEvent) ||
- (event instanceof DisclosureEvent) ||
- (event instanceof RowDisclosureEvent) ||
- (event instanceof SelectionEvent) ||
- (event instanceof SortEvent) ||
- (event instanceof FocusEvent);
- }
- return false;
- }
-
- private TableUtils()
- {
- }
+package org.apache.myfaces.adf.component;
+import java.util.List;
+import java.util.Map;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.event.FacesEvent;
+import javax.faces.event.PhaseId;
+
+import org.apache.myfaces.adf.event.DisclosureEvent;
+import org.apache.myfaces.adf.event.RowDisclosureEvent;
+import org.apache.myfaces.adf.event.FocusEvent;
+import org.apache.myfaces.adf.event.RangeChangeEvent;
+import org.apache.myfaces.adf.event.SelectionEvent;
+import org.apache.myfaces.adf.event.SortEvent;
+import org.apache.myfaces.adf.model.ModelUtils;
+import org.apache.myfaces.adf.model.RowKeySet;
+import org.apache.myfaces.adf.model.TreeModel;
+
+/**
+ * utility methods for dealing with tables.
+ * @author The Oracle ADF Faces Team
+ */
+public final class TableUtils
+{
+
+ /**
+ * Gets the index of the last visible row that should be
+ * displayed by the given table. This is usually
+ * {@link CollectionComponent#getFirst} added to
+ * {@link CollectionComponent#getRows} minus 1, but it changes if
+ * {@link CollectionComponent#getRowCount} returns
+ * insufficient rows.
+ * @return if this table is empty, this returns
+ * {@link CollectionComponent#getFirst()} - 1
+ */
+ public static int getLast(CollectionComponent table)
+ {
+ return getLast(table, table.getFirst());
+ }
+
+ /**
+ * Gets the index of the last visible row that should be
+ * displayed by the given table. This is usually
+ * rangeStart added to
+ * {@link CollectionComponent#getRows} minus 1, but it changes if
+ * {@link CollectionComponent#getRowCount} returns
+ * insufficient rows.
+ * @return if this table is empty, this returns
+ * rangeStart - 1
+ */
+ public static int getLast(CollectionComponent table, int rangeStart)
+ {
+ final int rangeEnd;
+ int blockSize = table.getRows();
+ // if the blockSize is zero, that means show everthing.
+ if (blockSize <= 0)
+ {
+ rangeEnd = Integer.MAX_VALUE;
+ }
+ else
+ {
+ rangeEnd = rangeStart + blockSize;
+ }
+ return ModelUtils.findLastIndex(table, rangeStart, rangeEnd) - 1;
+ }
+
+ /**
+ * Sets up an EL variable on the requestScope.
+ * @param name The name of the EL variable
+ * @param value The value of the EL variable
+ * @return any old value that was bound to the EL variable, or null
+ * if there was no old value.
+ */
+ public static Object setupELVariable(FacesContext context, String name, Object value)
+ {
+ Map requestMap = context.getExternalContext().getRequestMap();
+ if (value == null)
+ return requestMap.remove(name);
+ else
+ return requestMap.put(name, value);
+ }
+
+ /**
+ * Perform a safe expand all.
+ * Checks to make sure that a complete expand-all operation won't result in
+ * too many nodes being displayed to the user. If too many nodes will end
+ * up being displayed, this method only expands the immediate children before
+ * terminating. Otherwise, a complete expand-all operation is performed.
+ * @param maxSize the maximum number of nodes to display. A complete expand-all
+ * operation will not take place if more than this number of nodes
+ * will end up being displayed.
+ * @param model this tree model must have its path pointing to a particular
+ * node which must be a container.
+ */
+ static void __doSafeExpandAll(TreeModel model, RowKeySet state, int maxSize)
+ {
+ int size = _getSizeOfTree(model, maxSize);
+ if ((size < 0) || (size > maxSize))
+ {
+ // not safe to do expand all.
+ // first expand the current node:
+ state.add();
+
+ // now only expand immediate children:
+ model.enterContainer();
+ int i=0;
+ while(true)
+ {
+ model.setRowIndex(i++);
+ if (!model.isRowAvailable())
+ break;
+ state.add();
+ }
+ model.exitContainer();
+ }
+ else // safe to do expand all:
+ state.addAll();
+ }
+
+ /**
+ * Computes the number of nodes in a subtree.
+ * @param model the path must point to a node.
+ * @param maxSize the maximum number of nodes that will be searched.
+ * this method returns once this limit is reached.
+ * @return -1 if the number of nodes is unknown.
+ * If the limit is hit, then returns the number of nodes that are known
+ * to exist at the time the limit was hit. This number may be larger than
+ * maxSize.
+ */
+ static int _getSizeOfTree(TreeModel model, int maxSize)
+ {
+ if (model.isRowAvailable() && model.isContainer())
+ {
+ model.enterContainer();
+ try
+ {
+ int size = model.getRowCount();
+ for(int i=0, sz=size; i<sz; i++)
+ {
+ if (size > maxSize)
+ return size;
+ model.setRowIndex(i);
+ int kidSize = _getSizeOfTree(model, maxSize - size);
+ if (kidSize < 0)
+ return -1;
+ size += kidSize;
+ }
+ return size;
+ }
+ finally
+ {
+ model.exitContainer();
+ }
+ }
+ return 0;
+ }
+
+ /**
+ * This method sets the phaseID of the event
+ * according to the "immediate" property of this
+ * component.
+ * If "immediate" is set to true, this calls
+ * {@link FacesContext#renderResponse}
+ */
+ static void __handleQueueEvent(UIComponent comp, FacesEvent event)
+ {
+ if (_isImmediateEvent(comp, event))
+ {
+ String immediateAttr = UIXTree.IMMEDIATE_KEY.getName();
+ Object isImmediate = comp.getAttributes().get(immediateAttr);
+ if (Boolean.TRUE.equals(isImmediate))
+ {
+ event.setPhaseId(PhaseId.ANY_PHASE);
+ FacesContext context = FacesContext.getCurrentInstance();
+ context.renderResponse();
+ }
+ else
+ {
+ // the event should not execute before model updates are done.
+ // otherwise, the updates will be done to the wrong rows.
+
+ // we can't do this at the end of the UPDATE_MODEL phase because
+ // if there are errors during that phase, then we want to immediately render
+ // the response, and not deliver this ui event:
+ event.setPhaseId(PhaseId.INVOKE_APPLICATION);
+ }
+ }
+ }
+
+ /**
+ * Process all the facets of a component; these are
+ * generally not processed once per row.
+ * @param skipFacet the name of any facet that should not be processed
+ * at this time.
+ */
+ static void __processFacets(
+ FacesContext context,
+ final UIXCollection table,
+ UIComponent component,
+ final PhaseId phaseId,
+ String skipFacet)
+ {
+ Map facets = component.getFacets();
+ final UIComponent skip = (skipFacet != null)
+ ? (UIComponent) facets.get(skipFacet)
+ : null;
+
+ new ChildLoop()
+ {
+ protected void process(FacesContext context, UIComponent facet)
+ {
+ if (facet != skip)
+ table.processComponent(context, facet, phaseId);
+ }
+ }.runAlways(context, facets.values());
+ }
+
+ /**
+ * Process all the facets of any children that are columns; these are
+ * generally not processed once per row.
+ */
+ static void __processColumnFacets(
+ FacesContext context,
+ final UIXCollection table,
+ UIComponent column,
+ final PhaseId phaseId)
+ {
+ new ChildLoop()
+ {
+ protected void process(FacesContext context, UIComponent child)
+ {
+ if (child instanceof UIXColumn)
+ {
+ // process any facets of the child column:
+ __processFacets(context, table, child, phaseId, null);
+ // recursively process the facets of any grandchild columns:
+ __processColumnFacets(context, table, child, phaseId);
+ }
+ }
+ }.runAlways(context, column);
+ }
+
+ /**
+ * Process all the children of the given table
+ */
+ static void __processStampedChildren(
+ FacesContext context,
+ final UIXCollection table,
+ final PhaseId phaseId)
+ {
+ new ChildLoop()
+ {
+ protected void process(FacesContext context, UIComponent child)
+ {
+ table.processComponent(context, child, phaseId);
+ }
+ }.runAlways(context, table);
+ }
+
+ /**
+ * Process all the children of the given table
+ */
+ static void __processChildren(
+ FacesContext context,
+ final UIXCollection comp,
+ final PhaseId phaseId)
+ {
+
+ // process the children
+ int childCount = comp.getChildCount();
+ if (childCount != 0)
+ {
+ List children = comp.getChildren();
+
+ for (int i = 0; i < childCount; i++)
+ {
+ UIComponent child = (UIComponent)children.get(i);
+ comp.processComponent(context, child, phaseId);
+ }
+ }
+ }
+
+ /**
+ * Checks to see if the given event could possible be affected by the
+ * "immediate" property of the given component.
+ */
+ private static boolean _isImmediateEvent(UIComponent comp, FacesEvent event)
+ {
+ if (event.getComponent() == comp)
+ {
+ return
+ (event instanceof RangeChangeEvent) ||
+ (event instanceof DisclosureEvent) ||
+ (event instanceof RowDisclosureEvent) ||
+ (event instanceof SelectionEvent) ||
+ (event instanceof SortEvent) ||
+ (event instanceof FocusEvent);
+ }
+ return false;
+ }
+
+ private TableUtils()
+ {
+ }
}