Author: nbelaevski
Date: 2007-11-26 21:52:02 -0500 (Mon, 26 Nov 2007)
New Revision: 4279
Modified:
branches/3.1.x/sandbox/ui/listShuttle/src/main/config/component/listShuttle.xml
branches/3.1.x/sandbox/ui/listShuttle/src/main/java/org/richfaces/component/UIListShuttle.java
branches/3.1.x/sandbox/ui/listShuttle/src/main/java/org/richfaces/model/ListShuttleDataModel.java
branches/3.1.x/sandbox/ui/listShuttle/src/main/java/org/richfaces/renderkit/ListShuttleRendererBase.java
Log:
latest changes for listShuttle & orderingList
Modified: branches/3.1.x/sandbox/ui/listShuttle/src/main/config/component/listShuttle.xml
===================================================================
---
branches/3.1.x/sandbox/ui/listShuttle/src/main/config/component/listShuttle.xml 2007-11-27
02:51:55 UTC (rev 4278)
+++
branches/3.1.x/sandbox/ui/listShuttle/src/main/config/component/listShuttle.xml 2007-11-27
02:52:02 UTC (rev 4279)
@@ -60,6 +60,10 @@
<property hidden="true">
<name>value</name>
</property>
+ <property elonly="true">
+ <name>selection</name>
+ <description>Collection which stores a set of selected
items</description>
+ </property>
<property>
<name>orderControlsVisible</name>
Modified:
branches/3.1.x/sandbox/ui/listShuttle/src/main/java/org/richfaces/component/UIListShuttle.java
===================================================================
---
branches/3.1.x/sandbox/ui/listShuttle/src/main/java/org/richfaces/component/UIListShuttle.java 2007-11-27
02:51:55 UTC (rev 4278)
+++
branches/3.1.x/sandbox/ui/listShuttle/src/main/java/org/richfaces/component/UIListShuttle.java 2007-11-27
02:52:02 UTC (rev 4279)
@@ -7,8 +7,6 @@
import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -29,9 +27,6 @@
import javax.faces.model.DataModel;
import org.apache.commons.collections.map.CompositeMap;
-import org.richfaces.component.UIOrderingBaseComponent.UpdateModelCommand;
-import org.richfaces.component.UIOrderingList.SubmittedValue;
-import org.richfaces.component.UIOrderingList.ValueHolder;
import org.richfaces.model.ListShuttleDataModel;
import org.richfaces.model.ListShuttleRowKey;
@@ -45,7 +40,8 @@
public static final String COMPONENT_FAMILY = "org.richfaces.ListShuttle";
- public static final class SubmittedValue implements Serializable {
+ protected static final class SubmittedValue implements Serializable {
+ private static final Pattern ITEM_PATTERN =
Pattern.compile("(s|t)(\\d+)(s?a?)");
/**
*
*/
@@ -65,7 +61,7 @@
}
private void convertAndStoreKey(String keyString, int i, boolean keySource) {
- Matcher matcher = Pattern.compile("(s|t)(\\d+)(s?a?)").matcher(keyString);
+ Matcher matcher = ITEM_PATTERN.matcher(keyString);
matcher.matches();
try {
@@ -173,13 +169,19 @@
private boolean targetValueSet;
public Object saveState(FacesContext context) {
- // TODO Auto-generated method stub
- return super.saveState(context);
+ Object[] state = new Object[2];
+
+ state[0] = super.saveState(context);
+ state[1] = saveIterationState();
+
+ return state;
}
- public void restoreState(FacesContext context, Object state) {
- // TODO Auto-generated method stub
- super.restoreState(context, state);
+ public void restoreState(FacesContext context, Object object) {
+ Object[] state = (Object[]) object;
+
+ super.restoreState(context, state[0]);
+ restoreIterationState(state[1]);
}
public Object getLocalSourceValue() {
@@ -200,6 +202,7 @@
}
public void setSourceValue(Object sourceValue) {
+ setExtendedDataModel(null);
this.sourceValue = sourceValue;
this.sourceValueSet = true;
}
@@ -222,6 +225,7 @@
}
public void setTargetValue(Object targetValue) {
+ setExtendedDataModel(null);
this.targetValue = targetValue;
this.targetValueSet = true;
}
@@ -263,6 +267,7 @@
targetValue = holder.targetValue;
targetValueSet = holder.targetValueSet;
+
}
public org.ajax4jsf.model.ExtendedDataModel createDataModel() {
@@ -270,13 +275,20 @@
DataModel targetDataModel = createDataModel(getTargetValue());
if (isTranslatedRenderingState() || isTranslatedState()) {
+ Map sourceTranslationTable = null;
+ Map targetTranslationTable = null;
+
+ if (submittedValueHolder != null) {
+ sourceTranslationTable = submittedValueHolder.sourceTranslationTable;
+ targetTranslationTable = submittedValueHolder.targetTranslationTable;
+ }
+
return new ListShuttleDataModel(sourceDataModel, targetDataModel,
isTranslatedState(),
- submittedValueHolder != null ?
- new CompositeMap(submittedValueHolder.sourceTranslationTable,
submittedValueHolder.targetTranslationTable)
- : null);
+ sourceTranslationTable,
+ targetTranslationTable);
} else {
- return new ListShuttleDataModel(sourceDataModel, targetDataModel, false, null);
+ return new ListShuttleDataModel(sourceDataModel, targetDataModel, false, null, null);
}
}
@@ -386,6 +398,8 @@
return;
}
+ updateModel(context, updateActiveItemCommand);
+ updateModel(context, updateSelectionCommand);
updateModel(context, updateSourceCommand);
updateModel(context, updateTargetCommand);
}
@@ -457,18 +471,18 @@
// "submitted" value, and emit a ValueChangeEvent if appropriate
if (isValid()) {
Object rowKey = getRowKey();
-//
-// Set selectionSet = new HashSet();
-// Set selectedItems = submittedValueHolder.selectedItems;
-// for (Iterator iterator = selectedItems.iterator(); iterator
-// .hasNext();) {
-// setRowKey(context, iterator.next());
-// Object selectionItem = getRowData();
-//
-// selectionSet.add(selectionItem);
-// }
-//
-// setSelection(selectionSet);
+
+ Set selectionSet = new HashSet();
+ Set selectedItems = submittedValueHolder.selectedItems;
+ for (Iterator iterator = selectedItems.iterator(); iterator
+ .hasNext();) {
+ setRowKey(context, iterator.next());
+ Object selectionItem = getRowData();
+
+ selectionSet.add(selectionItem);
+ }
+
+ setSelection(selectionSet);
// if (submittedValueHolder.activeItem != null) {
// setRowKey(context, submittedValueHolder.activeItem);
@@ -588,4 +602,8 @@
setTranslatedRenderingState();
}
}
+
+ public Object getTranslatedRowKey() {
+ return ((ListShuttleDataModel) getExtendedDataModel()).getTranslatedRowKey();
+ }
}
Modified:
branches/3.1.x/sandbox/ui/listShuttle/src/main/java/org/richfaces/model/ListShuttleDataModel.java
===================================================================
---
branches/3.1.x/sandbox/ui/listShuttle/src/main/java/org/richfaces/model/ListShuttleDataModel.java 2007-11-27
02:51:55 UTC (rev 4278)
+++
branches/3.1.x/sandbox/ui/listShuttle/src/main/java/org/richfaces/model/ListShuttleDataModel.java 2007-11-27
02:52:02 UTC (rev 4279)
@@ -4,7 +4,9 @@
package org.richfaces.model;
import java.io.IOException;
+import java.util.Iterator;
import java.util.Map;
+import java.util.Map.Entry;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
@@ -14,6 +16,7 @@
import org.ajax4jsf.model.Range;
import org.ajax4jsf.model.SequenceDataModel;
import org.ajax4jsf.model.SequenceRange;
+import org.apache.commons.collections.map.CompositeMap;
/**
* @author Nick Belaevski
@@ -30,6 +33,10 @@
private SequenceDataModel sourceModel;
private SequenceDataModel targetModel;
+ private Map sourceTranslationTable;
+
+ private Map targetTranslationTable;
+
protected static final class TranslatedRowKey {
private Object rowKey;
@@ -54,6 +61,30 @@
}
};
+ protected static final class MovedRowKey {
+ private Object rowKey;
+
+ private boolean sourceKey;
+
+ public MovedRowKey(Object key, boolean sourceKey) {
+ super();
+ this.rowKey = key;
+ this.sourceKey = sourceKey;
+ }
+
+ public Object getRowKey() {
+ return rowKey;
+ }
+
+ public boolean isSourceKey() {
+ return sourceKey;
+ }
+
+ public String toString() {
+ return rowKey.toString();
+ }
+ };
+
/* (non-Javadoc)
* @see org.ajax4jsf.model.ExtendedDataModel#getRowKey()
*/
@@ -99,6 +130,12 @@
if (key instanceof TranslatedRowKey) {
ListShuttleRowKey shuttleRowKey = (ListShuttleRowKey) ((TranslatedRowKey)
key).getRowKey();
setShuttleRowKey(shuttleRowKey);
+ } else if (key instanceof MovedRowKey) {
+ MovedRowKey mrk = (MovedRowKey) key;
+ setRowKey(mrk.getRowKey());
+ if (!this.translatedModel) {
+ useSource = Boolean.valueOf(mrk.isSourceKey());
+ }
} else {
if (this.translatedModel) {
if (rowKey != null) {
@@ -113,10 +150,14 @@
}
public ListShuttleDataModel(DataModel source, DataModel target,
- boolean translatedModel, Map translationTable) {
+ boolean translatedModel, Map sourceTranslationTable, Map targetTranslationTable) {
super();
this.translatedModel = translatedModel;
- this.translationTable = translationTable;
+ this.sourceTranslationTable = sourceTranslationTable;
+ this.targetTranslationTable = targetTranslationTable;
+ if (sourceTranslationTable != null && targetTranslationTable != null) {
+ this.translationTable = new CompositeMap(sourceTranslationTable,
targetTranslationTable);
+ }
this.sourceModel = new org.ajax4jsf.model.SequenceDataModel(source);
this.targetModel = new org.ajax4jsf.model.SequenceDataModel(target);
@@ -128,39 +169,61 @@
public void walk(final FacesContext context, final DataVisitor visitor, Range range,
Object argument) throws IOException {
- this.sourceModel.walk(context, new DataVisitor() {
- public void process(FacesContext context, Object rowKey,
- Object argument) throws IOException {
-
- ListShuttleRowKey shuttleRowKey = new ListShuttleRowKey(rowKey, true);
- Object translatedShuttleRowKey = translate(shuttleRowKey);
-
- if (translatedModel) {
- visitor.process(context, new TranslatedRowKey(
- shuttleRowKey, String.valueOf(translatedShuttleRowKey)), argument);
- } else {
- visitor.process(context, translatedShuttleRowKey, argument);
+ if (translationTable != null) {
+ //TODO is it ordered?
+ Iterator translations = this.translationTable.entrySet().iterator();
+ while (translations.hasNext()) {
+ Entry translation = (Entry) translations.next();
+ ListShuttleRowKey translatedKey = (ListShuttleRowKey) translation.getKey();
+ ListShuttleRowKey sourceKey = (ListShuttleRowKey) translation.getValue();
+
+ if (translatedModel) {
+ visitor.process(context, new TranslatedRowKey(
+ translatedKey, String.valueOf(sourceKey)), argument);
+ } else {
+ visitor.process(context, new MovedRowKey(sourceKey,
sourceTranslationTable.containsKey(translatedKey)),
+ argument);
+ }
}
- }
- }, new SequenceRange(0, -1), argument);
+ } else {
+ this.sourceModel.walk(context, new DataVisitor() {
+ public void process(FacesContext context, Object rowKey,
+ Object argument) throws IOException {
- this.targetModel.walk(context, new DataVisitor(){
- public void process(FacesContext context, Object rowKey,
- Object argument) throws IOException {
-
- ListShuttleRowKey shuttleRowKey = new ListShuttleRowKey(rowKey, false);
+ ListShuttleRowKey shuttleRowKey = new ListShuttleRowKey(rowKey, true);
Object translatedShuttleRowKey = translate(shuttleRowKey);
-
+
if (translatedModel) {
visitor.process(context, new TranslatedRowKey(
shuttleRowKey, String.valueOf(translatedShuttleRowKey)), argument);
} else {
- visitor.process(context, translatedShuttleRowKey, argument);
+ visitor.process(context, new MovedRowKey(translatedShuttleRowKey, true), argument);
}
}
- }, new SequenceRange(0, -1), argument);
+ }, new SequenceRange(0, -1), argument);
+
+ this.targetModel.walk(context, new DataVisitor(){
+ public void process(FacesContext context, Object rowKey,
+ Object argument) throws IOException {
+
+ ListShuttleRowKey shuttleRowKey = new ListShuttleRowKey(rowKey, false);
+ Object translatedShuttleRowKey = translate(shuttleRowKey);
+
+ if (translatedModel) {
+ visitor.process(context, new TranslatedRowKey(
+ shuttleRowKey, String.valueOf(translatedShuttleRowKey)), argument);
+ } else {
+ visitor.process(context, new MovedRowKey(translatedShuttleRowKey, false),
argument);
+ }
+ }
+ }, new SequenceRange(0, -1), argument);
+ }
}
+ public Object getTranslatedRowKey() {
+ return this.translate(getRowKey());
+ }
+
/* (non-Javadoc)
* @see javax.faces.model.DataModel#getRowCount()
*/
@@ -172,9 +235,9 @@
* @see javax.faces.model.DataModel#getRowData()
*/
public Object getRowData() {
- if (isSource()) {
+ if (sourceModel.isRowAvailable()) {
return sourceModel.getRowData();
- } else if (isTarget()) {
+ } else if (targetModel.isRowAvailable()) {
return targetModel.getRowData();
} else {
return null;
@@ -200,13 +263,7 @@
* @see javax.faces.model.DataModel#isRowAvailable()
*/
public boolean isRowAvailable() {
- if (isSource()) {
- return sourceModel.isRowAvailable();
- } else if (isTarget()) {
- return targetModel.isRowAvailable();
- } else {
- return false;
- }
+ return sourceModel.isRowAvailable() || targetModel.isRowAvailable();
}
/* (non-Javadoc)
Modified:
branches/3.1.x/sandbox/ui/listShuttle/src/main/java/org/richfaces/renderkit/ListShuttleRendererBase.java
===================================================================
---
branches/3.1.x/sandbox/ui/listShuttle/src/main/java/org/richfaces/renderkit/ListShuttleRendererBase.java 2007-11-27
02:51:55 UTC (rev 4278)
+++
branches/3.1.x/sandbox/ui/listShuttle/src/main/java/org/richfaces/renderkit/ListShuttleRendererBase.java 2007-11-27
02:52:02 UTC (rev 4279)
@@ -234,15 +234,21 @@
writer.endElement(HTML.DIV_ELEM);
}
+ private boolean isEmpty(String s) {
+ return s == null || s.length() == 0;
+ }
+
protected void doDecode(FacesContext context, UIComponent component) {
super.doDecode(context, component);
String clientId = component.getClientId(context);
Object object =
context.getExternalContext().getRequestParameterValuesMap().get(clientId);
if (object != null) {
- UIListShuttle listShuttle = (UIListShuttle) component;
String[] submittedValues = (String[]) object;
- listShuttle.setSubmittedStrings(submittedValues);
+ if (submittedValues.length == 2 && !isEmpty(submittedValues[0]) &&
!isEmpty(submittedValues[1])) {
+ UIListShuttle listShuttle = (UIListShuttle) component;
+ listShuttle.setSubmittedStrings(submittedValues);
+ }
}
}