[richfaces-svn-commits] JBoss Rich Faces SVN: r4433 - in branches/3.1.x/ui/listShuttle/src/main: java/org/richfaces/component and 3 other directories.
richfaces-svn-commits at lists.jboss.org
richfaces-svn-commits at lists.jboss.org
Tue Dec 4 00:21:32 EST 2007
Author: nbelaevski
Date: 2007-12-04 00:21:32 -0500 (Tue, 04 Dec 2007)
New Revision: 4433
Modified:
branches/3.1.x/ui/listShuttle/src/main/config/component/listShuttle.xml
branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/component/UIListShuttle.java
branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/model/ListShuttleDataModel.java
branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/model/ListShuttleRowKey.java
branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/renderkit/ListShuttleRendererBase.java
branches/3.1.x/ui/listShuttle/src/main/templates/org/richfaces/htmlListShuttle.jspx
Log:
latest changes for listShuttle & orderingList
Modified: branches/3.1.x/ui/listShuttle/src/main/config/component/listShuttle.xml
===================================================================
--- branches/3.1.x/ui/listShuttle/src/main/config/component/listShuttle.xml 2007-12-04 05:21:18 UTC (rev 4432)
+++ branches/3.1.x/ui/listShuttle/src/main/config/component/listShuttle.xml 2007-12-04 05:21:32 UTC (rev 4433)
@@ -43,9 +43,6 @@
<property hidden="true" el="false">
<name>submittedValue</name>
</property>
- <property hidden="true" el="false" exist="true">
- <name>submittedStrings</name>
- </property>
<property hidden="true" el="false">
<name>localValueSet</name>
</property>
@@ -60,10 +57,6 @@
<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>switchByClick</name>
Modified: branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/component/UIListShuttle.java
===================================================================
--- branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/component/UIListShuttle.java 2007-12-04 05:21:18 UTC (rev 4432)
+++ branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/component/UIListShuttle.java 2007-12-04 05:21:32 UTC (rev 4433)
@@ -6,12 +6,14 @@
import java.io.IOException;
import java.io.Serializable;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashSet;
import java.util.Map;
import java.util.Set;
-import java.util.regex.Pattern;
import javax.faces.FacesException;
+import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.convert.ConverterException;
@@ -22,6 +24,7 @@
import javax.faces.model.DataModel;
import org.ajax4jsf.model.DataVisitor;
+import org.richfaces.component.UIOrderingBaseComponent.UpdateModelCommand;
import org.richfaces.model.ListShuttleDataModel;
import org.richfaces.model.ListShuttleRowKey;
@@ -35,104 +38,88 @@
public static final String COMPONENT_FAMILY = "org.richfaces.ListShuttle";
+ private Collection sourceSelection;
+ private boolean sourceSelectionSet;
+
+ private Collection targetSelection;
+ private boolean targetSelectionSet;
+
+ public UIListShuttle() {
+ super();
+
+ final ComponentVisitor decodeVisitor = this.decodeVisitor;
+
+ this.decodeVisitor = new ComponentVisitor() {
+
+ public void processComponent(FacesContext context, UIComponent c,
+ Object argument) throws IOException {
+
+ if (UIListShuttle.this.submittedValueHolder != null) {
+ //TODO check for item existence
+ }
+
+ decodeVisitor.processComponent(context, c, argument);
+ }
+
+ };
+ }
+
+ protected void processDecodes(FacesContext faces, Object argument) {
+ if (!this.isRendered())
+ return;
+ this.decode(faces);
+ this.iterate(faces, decodeVisitor, argument);
+ }
+
private final class ModelItemState implements ItemState {
- private Collection selectedItems;
+ private Collection sourceSelectedItems;
+ private Collection targetSelectedItems;
private Object activeItem;
- public ModelItemState(Collection selectedItems, Object activeItem) {
+ public ModelItemState(Collection sourceSelectedItems, Collection targetSelectedItems, Object activeItem) {
super();
- this.selectedItems = selectedItems;
+ this.sourceSelectedItems = sourceSelectedItems;
+ this.targetSelectedItems = targetSelectedItems;
this.activeItem = activeItem;
}
public boolean isSelected() {
- return selectedItems != null && selectedItems.contains(getRowData());
+ Object rowData = getRowData();
+ return ((sourceSelectedItems != null && sourceSelectedItems.contains(rowData)) ||
+ (targetSelectedItems != null && targetSelectedItems.contains(rowData)));
}
public boolean isActive() {
- return activeItem != null && ((Set) activeItem).contains(getRowData());
+ return activeItem != null && activeItem.equals(getRowData());
}
}
- protected static final class SubmittedValue extends OrderingBaseAbstractSubmittedValue {
- private static final Pattern KEY_STRING_PATTERN = Pattern.compile("((?:s|t)\\d+)(s?a?)");
+ protected static final class SubmittedValue implements Serializable {
/**
*
*/
private static final long serialVersionUID = 5655312942714191981L;
//ListShuttleRowKey -> ListShuttleRowKey
- private Map sourceTranslationTable = null;
- private Map targetTranslationTable = null;
+ private Map map = null;
- private transient boolean source;
+ private Set sourceSelection;
+ private Set targetSelection;
+
+ private Object activeItem;
+
+ public SubmittedValue(Map map, Set sourceSelection, Set targetSelection, Object activeItem) {
+ this.map = map;
+
+ this.sourceSelection = sourceSelection;
+ this.targetSelection = targetSelection;
- public SubmittedValue(String[] submittedStrings) {
- super();
-
- source = true;
- sourceTranslationTable = asMap(submittedStrings[0]);
- source = false;
- targetTranslationTable = asMap(submittedStrings[1]);
+ this.activeItem = activeItem;
}
- public String toTargetString() {
- return asString(targetTranslationTable);
- }
-
- public String toSourceString() {
- return asString(sourceTranslationTable);
- }
-
- public Map getSourceTranslationTable() {
- return sourceTranslationTable;
- }
-
- public Map getTargetTranslationTable() {
- return targetTranslationTable;
- }
-
- protected Object createNewKey(int i) {
- return new ListShuttleRowKey(new Integer(i), source);
- }
-
- protected Object createOldKey(String keyString) {
- char c = keyString.charAt(0);
- boolean sourceKey = false;
- Integer integer;
-
- try {
- if (c == 's') {
- sourceKey = true;
- } else if (c == 't') {
- sourceKey = false;
- } else {
- throw new IllegalArgumentException();
- }
-
- integer = new Integer(keyString.substring(1));
- } catch (NumberFormatException e) {
- throw new FacesException(new IllegalArgumentException());
- }
-
- return new ListShuttleRowKey(integer, sourceKey, source);
- }
-
- protected Pattern getKeyStringPattern() {
- return KEY_STRING_PATTERN;
- }
}
- public String getSourceSubmittedString() {
- return submittedValueHolder != null ? submittedValueHolder.toSourceString() : "";
- }
+ private transient Map map;
- public String getTargetSubmittedString() {
- return submittedValueHolder != null ? submittedValueHolder.toTargetString() : "";
- }
-
- private transient Map sourceTranslationTable;
- private transient Map targetTranslationTable;
-
private transient SubmittedValue submittedValueHolder = null;
protected static final class ValueHolder implements Serializable {
@@ -147,8 +134,13 @@
private Object targetValue;
private boolean targetValueSet;
- private Map sourceTranslationTable;
- private Map targetTranslationTable;
+ private Collection sourceSelection;
+ private boolean sourceSelectionSet;
+
+ private Collection targetSelection;
+ private boolean targetSelectionSet;
+
+ private Map map;
}
private Object sourceValue;
@@ -158,11 +150,52 @@
private boolean targetValueSet;
public Object saveState(FacesContext context) {
- Object[] state = new Object[2];
+ Object[] state = new Object[8];
state[0] = super.saveState(context);
state[1] = saveIterationState();
+ final HashSet sourceSelectionKeySet = new HashSet();
+ final HashSet targetSelectionKeySet = new HashSet();
+ final HashSet activeItemSet = new HashSet(1);
+
+ Object rowKey = getRowKey();
+ try {
+ walk(context, new DataVisitor() {
+
+ public void process(FacesContext context, Object rowKey,
+ Object argument) throws IOException {
+
+ setRowKey(context, rowKey);
+ Object data = getRowData();
+
+ if (data != null) {
+ if (data.equals(activeItem)) {
+ activeItemSet.add(rowKey);
+ }
+
+ if (sourceSelection != null && sourceSelection.contains(data)) {
+ sourceSelectionKeySet.add(rowKey);
+ } else if (targetSelection != null && targetSelection.contains(data)){
+ targetSelectionKeySet.add(rowKey);
+ }
+ }
+ }
+
+ }, null);
+ } catch (IOException e) {
+ throw new FacesException(e.getLocalizedMessage(), e);
+ }
+
+ state[2] = sourceSelectionKeySet;
+ state[3] = this.sourceSelectionSet ? Boolean.TRUE : Boolean.FALSE;
+
+ state[4] = targetSelectionKeySet;
+ state[5] = this.targetSelectionSet ? Boolean.TRUE : Boolean.FALSE;
+
+ state[6] = activeItemSet.isEmpty() ? null : activeItemSet.iterator().next();
+ state[7] = this.activeItemSet ? Boolean.TRUE : Boolean.FALSE;
+
return state;
}
@@ -171,6 +204,15 @@
super.restoreState(context, state[0]);
restoreIterationState(state[1]);
+
+ this.sourceSelection = (Collection) state[2];
+ this.sourceSelectionSet = ((Boolean) state[3]).booleanValue();
+
+ this.targetSelection = (Collection) state[4];
+ this.targetSelectionSet = ((Boolean) state[5]).booleanValue();
+
+ this.activeItem = state[6];
+ this.activeItemSet = ((Boolean) state[7]).booleanValue();
}
public Object getSourceValue() {
@@ -211,43 +253,8 @@
this.targetValueSet = true;
}
- public void setSubmittedStrings(String[] submittedStrings) {
- this.submittedValueHolder = new SubmittedValue(submittedStrings);
- final Map sourceTranslationTable = this.submittedValueHolder.getSourceTranslationTable();
- final Map targetTranslationTable = this.submittedValueHolder.getTargetTranslationTable();
-
- if (sourceTranslationTable != null && targetTranslationTable != null) {
- sourceTranslationTable.entrySet().removeAll(targetTranslationTable.entrySet());
- } else {
- ListShuttleDataModel dataModel = (ListShuttleDataModel) getExtendedDataModel();
- FacesContext context = FacesContext.getCurrentInstance();
-
- try {
- if (sourceTranslationTable != null) {
- dataModel.walkTarget(context, new DataVisitor() {
-
- public void process(FacesContext context, Object rowKey,
- Object argument) throws IOException {
-
- sourceTranslationTable.entrySet().remove(rowKey);
- }
-
- }, null, null);
- } else if (targetTranslationTable != null) {
- dataModel.walkSource(context, new DataVisitor() {
-
- public void process(FacesContext context, Object rowKey,
- Object argument) throws IOException {
-
- targetTranslationTable.entrySet().remove(rowKey);
- }
-
- }, null, null);
- }
- } catch (IOException e) {
- throw new FacesException(e.getLocalizedMessage(), e);
- }
- }
+ public void setSubmittedStrings(Map map, Set sourceSelection, Set targetSelection, Object activeItem) {
+ this.submittedValueHolder = new SubmittedValue(map, sourceSelection, targetSelection, activeItem);
}
protected Object saveIterationSubmittedState() {
@@ -267,48 +274,57 @@
holder.targetValue = targetValue;
holder.targetValueSet = targetValueSet;
- holder.sourceTranslationTable = sourceTranslationTable;
- holder.targetTranslationTable = targetTranslationTable;
+ holder.sourceSelection = this.sourceSelection;
+ holder.sourceSelectionSet = this.sourceSelectionSet;
+
+ holder.targetSelection = this.targetSelection;
+ holder.targetSelectionSet = this.targetSelectionSet;
+ holder.map = map;
+
return holder;
}
protected void restoreIterationState(Object object) {
ValueHolder holder = (ValueHolder) object;
- sourceValue = holder.sourceValue ;
- sourceValueSet = holder.sourceValueSet;
+ this.sourceValue = holder.sourceValue ;
+ this.sourceValueSet = holder.sourceValueSet;
- targetValue = holder.targetValue;
- targetValueSet = holder.targetValueSet;
+ this.targetValue = holder.targetValue;
+ this.targetValueSet = holder.targetValueSet;
- sourceTranslationTable = holder.sourceTranslationTable;
- targetTranslationTable = holder.targetTranslationTable;
+ this.sourceSelection = holder.sourceSelection;
+ this.sourceSelectionSet = holder.sourceSelectionSet;
+
+ this.targetSelection = holder.targetSelection;
+ this.targetSelectionSet = holder.targetSelectionSet;
+
+ map = holder.map;
}
public org.ajax4jsf.model.ExtendedDataModel createDataModel() {
+ Map source = null;
+
+ if (submittedValueHolder != null) {
+ source = submittedValueHolder.map;
+ } else {
+ source = this.map;
+ }
+
+ if (source != null) {
+ ListShuttleDataModel dataModel = new ListShuttleDataModel();
+ dataModel.setWrappedData(source);
+
+ return dataModel;
+ }
+
DataModel sourceDataModel = createDataModel(getSourceValue());
DataModel targetDataModel = createDataModel(getTargetValue());
- if (isTranslatedRenderingState() || isTranslatedState()) {
- Map sourceTranslationTable = null;
- Map targetTranslationTable = null;
-
- if (submittedValueHolder != null) {
- sourceTranslationTable = submittedValueHolder.sourceTranslationTable;
- targetTranslationTable = submittedValueHolder.targetTranslationTable;
- } else {
- sourceTranslationTable = this.sourceTranslationTable;
- targetTranslationTable = this.targetTranslationTable;
- }
-
- return new ListShuttleDataModel(sourceDataModel, targetDataModel,
- isTranslatedState(),
- sourceTranslationTable,
- targetTranslationTable);
- } else {
- return new ListShuttleDataModel(sourceDataModel, targetDataModel, false, null, null);
- }
+ ListShuttleDataModel dataModel = new ListShuttleDataModel();
+ dataModel.setWrappedData(new DataModel[]{sourceDataModel, targetDataModel});
+ return dataModel;
}
public void addValueChangeListener(ValueChangeListener listener) {
@@ -325,16 +341,36 @@
removeFacesListener(listener);
}
- public boolean isSource() {
- ListShuttleDataModel dataModel = (ListShuttleDataModel) getExtendedDataModel();
- return dataModel.isSource();
- }
+ protected final UpdateModelCommand updateTargetSelectionCommand = new UpdateModelCommand() {
- public boolean isTarget() {
- ListShuttleDataModel dataModel = (ListShuttleDataModel) getExtendedDataModel();
- return dataModel.isTarget();
- }
+ public void execute(FacesContext context) {
+ if (targetSelectionSet) {
+ ValueBinding vb = getValueBinding("targetSelection");
+ if (vb != null) {
+ vb.setValue(context, targetSelection);
+ targetSelection = null;
+ targetSelectionSet = false;
+ }
+ }
+ }
+
+ };
+
+ protected final UpdateModelCommand updateSourceSelectionCommand = new UpdateModelCommand() {
+ public void execute(FacesContext context) {
+ if (sourceSelectionSet) {
+ ValueBinding vb = getValueBinding("sourceSelection");
+ if (vb != null) {
+ vb.setValue(context, sourceSelection);
+ sourceSelection = null;
+ sourceSelectionSet = false;
+ }
+ }
+ }
+
+ };
+
private final UpdateModelCommand updateSourceCommand = new UpdateModelCommand() {
public void execute(FacesContext context) {
@@ -408,7 +444,8 @@
}
updateModel(context, updateActiveItemCommand);
- updateModel(context, updateSelectionCommand);
+ updateModel(context, updateSourceSelectionCommand);
+ updateModel(context, updateTargetSelectionCommand);
updateModel(context, updateSourceCommand);
updateModel(context, updateTargetCommand);
}
@@ -470,47 +507,32 @@
Object newTargetValue = oldTargetValue;
try {
+ final ArrayList sourceList = new ArrayList();
+ final ArrayList targetList = new ArrayList();
+
final ListShuttleDataModel listShuttleDataModel = (ListShuttleDataModel) getExtendedDataModel();
-
- listShuttleDataModel.setSourceTranslationTable(submittedValueHolder.getSourceTranslationTable());
- listShuttleDataModel.setTargetTranslationTable(submittedValueHolder.getTargetTranslationTable());
-
try {
- if (listShuttleDataModel.needSourceTranslation()) {
- final DataAdder sourceValueAdder = createDataAdder(oldSourceValue, listShuttleDataModel.getSourceRowCount());
- listShuttleDataModel.walkSource(context, new DataVisitor() {
+ listShuttleDataModel.walk(context, new DataVisitor() {
- public void process(FacesContext context, Object rowKey,
- Object argument) throws IOException {
+ public void process(FacesContext context, Object rowKey,
+ Object argument) throws IOException {
- setRowKey(rowKey);
- sourceValueAdder.add(getRowData());
+ setRowKey(context, rowKey);
+
+ ListShuttleRowKey listShuttleRowKey = (ListShuttleRowKey) rowKey;
+ if (listShuttleRowKey.isFacadeSource()) {
+ sourceList.add(getRowData());
+ } else {
+ targetList.add(getRowData());
}
-
- }, null, null);
-
- newSourceValue = sourceValueAdder.getContainer();
- }
-
- if (listShuttleDataModel.needTargetTranslation()) {
- final DataAdder targetValueAdder = createDataAdder(oldTargetValue, listShuttleDataModel.getTargetRowCount());
- listShuttleDataModel.walkTarget(context, new DataVisitor() {
-
- public void process(FacesContext context, Object rowKey,
- Object argument) throws IOException {
-
- setRowKey(rowKey);
- targetValueAdder.add(getRowData());
- }
-
- }, null, null);
-
- newTargetValue = targetValueAdder.getContainer();
- }
-
+ }
+ }, null, null);
} catch (IOException e) {
throw new ConverterException(e.getLocalizedMessage(), e);
}
+
+ newSourceValue = createContainer(sourceList, oldSourceValue.getClass());
+ newTargetValue = createContainer(targetList, oldTargetValue.getClass());
}
catch (ConverterException ce) {
Object submittedValue = submittedValueHolder;
@@ -523,13 +545,9 @@
// If our value is valid, store the new value, erase the
// "submitted" value, and emit a ValueChangeEvent if appropriate
if (isValid()) {
- Set[] sets = convertKeySets(context,
- new Set[] {
- submittedValueHolder.getSelection(),
- submittedValueHolder.getActiveItems() });
-
- setSelection(sets[0]);
- setActiveItem(sets[1]);
+ setSourceSelection(submittedValueHolder.sourceSelection);
+ setTargetSelection(submittedValueHolder.targetSelection);
+ setActiveItem(submittedValueHolder.activeItem);
Object previousSource = getSourceValue();
Object previousTarget = getTargetValue();
@@ -545,8 +563,7 @@
new Object[]{newSourceValue, newTargetValue}));
}
- this.sourceTranslationTable = this.submittedValueHolder.sourceTranslationTable;
- this.targetTranslationTable = this.submittedValueHolder.targetTranslationTable;
+ this.map = this.submittedValueHolder.map;
this.submittedValueHolder = null;
@@ -556,24 +573,19 @@
protected void resetDataModel() {
super.resetDataModel();
- this.sourceTranslationTable = null;
- this.targetTranslationTable = null;
+ this.map = null;
if (this.submittedValueHolder != null) {
setTranslatedRenderingState();
}
}
- public Object getTranslatedRowKey() {
- return ((ListShuttleDataModel) getExtendedDataModel()).getTranslatedRowKey();
- }
-
public ItemState getItemState() {
if (submittedValueHolder != null) {
- return new SubmittedItemState(submittedValueHolder.getSelection(),
- submittedValueHolder.getActiveItems());
+ return new ModelItemState(submittedValueHolder.sourceSelection, submittedValueHolder.targetSelection,
+ submittedValueHolder.activeItem);
} else {
- return new ModelItemState(getSelection(), getActiveItem());
+ return new ModelItemState(getSourceSelection(), getTargetSelection(), getActiveItem());
}
}
@@ -588,4 +600,41 @@
public abstract boolean isFastMoveControlsVisible();
public abstract void setFastMoveControlsVisible(boolean visible);
+
+ public Collection getSourceSelection() {
+ if (this.sourceSelection != null) {
+ return this.sourceSelection;
+ } else {
+ ValueBinding vb = getValueBinding("sourceSelection");
+ if (vb != null) {
+ return (Collection) vb.getValue(FacesContext.getCurrentInstance());
+ }
+ }
+
+ return null;
+ }
+
+ public void setSourceSelection(Collection collection) {
+ this.sourceSelection = collection;
+ this.sourceSelectionSet = true;
+ }
+
+ public Collection getTargetSelection() {
+ if (this.targetSelection != null) {
+ return this.targetSelection;
+ } else {
+ ValueBinding vb = getValueBinding("targetSelection");
+ if (vb != null) {
+ return (Collection) vb.getValue(FacesContext.getCurrentInstance());
+ }
+ }
+
+ return null;
+ }
+
+ public void setTargetSelection(Collection collection) {
+ this.targetSelection = collection;
+ this.targetSelectionSet = true;
+ }
+
}
Modified: branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/model/ListShuttleDataModel.java
===================================================================
--- branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/model/ListShuttleDataModel.java 2007-12-04 05:21:18 UTC (rev 4432)
+++ branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/model/ListShuttleDataModel.java 2007-12-04 05:21:32 UTC (rev 4433)
@@ -4,7 +4,6 @@
package org.richfaces.model;
import java.io.IOException;
-import java.io.Serializable;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
@@ -16,7 +15,6 @@
import org.ajax4jsf.model.ExtendedDataModel;
import org.ajax4jsf.model.Range;
import org.ajax4jsf.model.SequenceDataModel;
-import org.ajax4jsf.model.SequenceRange;
/**
* @author Nick Belaevski
@@ -24,48 +22,15 @@
*/
public class ListShuttleDataModel extends ExtendedDataModel {
- private Object rowKey;
+ private ListShuttleRowKey rowKey;
- private Boolean useSourceFacade = null;
- private Boolean useSourceModel = null;
-
- private boolean translatedModel;
private SequenceDataModel sourceModel;
private SequenceDataModel targetModel;
- private Map sourceTranslationTable;
+ private Map data;
- private Map targetTranslationTable;
-
- protected static final class TranslatedRowKey implements Serializable {
- /**
- *
- */
- private static final long serialVersionUID = -7299475726153818934L;
-
- private Object rowKey;
-
- private String asString;
-
- public TranslatedRowKey(Object key, String asString) {
- super();
- this.rowKey = key;
- this.asString = asString;
- }
-
- public Object getRowKey() {
- return rowKey;
- }
-
- public String getAsString() {
- return asString;
- }
-
- public String toString() {
- return getAsString();
- }
- };
-
+ private Object wrappedData;
+
/* (non-Javadoc)
* @see org.ajax4jsf.model.ExtendedDataModel#getRowKey()
*/
@@ -73,259 +38,113 @@
return rowKey;
}
- private Object translate(Object key) {
- if (key != null) {
- if (sourceTranslationTable != null && sourceTranslationTable.containsKey(key)) {
- return sourceTranslationTable.get(key);
- } else if (targetTranslationTable != null && targetTranslationTable.containsKey(key)) {
- return targetTranslationTable.get(key);
- } else {
- return key;
- }
- } else {
- return key;
- }
- }
-
- private void setShuttleRowKey(ListShuttleRowKey shuttleRowKey) {
- Object sourceKey = null;
- Object targetKey = null;
- Boolean useSourceFacade = null;
- Boolean useSourceModel = null;
-
- if (shuttleRowKey != null) {
- if (shuttleRowKey.isSource()) {
- sourceKey = shuttleRowKey.getRowKey();
- useSourceModel = Boolean.TRUE;
- } else {
- targetKey = shuttleRowKey.getRowKey();
- useSourceModel = Boolean.FALSE;
- }
-
- useSourceFacade = (shuttleRowKey.isFacadeSource() ? Boolean.TRUE : Boolean.FALSE);
- }
-
- this.useSourceFacade = useSourceFacade;
- this.useSourceModel = useSourceModel;
-
- this.sourceModel.setRowKey(sourceKey);
- this.targetModel.setRowKey(targetKey);
- }
-
/* (non-Javadoc)
* @see org.ajax4jsf.model.ExtendedDataModel#setRowKey(java.lang.Object)
*/
public void setRowKey(Object key) {
- this.rowKey = key;
+ this.rowKey = (ListShuttleRowKey) key;
+ }
- if (key instanceof TranslatedRowKey) {
- ListShuttleRowKey shuttleRowKey = (ListShuttleRowKey) ((TranslatedRowKey) key).getRowKey();
- setShuttleRowKey(shuttleRowKey);
- } else {
- if (this.translatedModel) {
- if (rowKey != null) {
- setShuttleRowKey((ListShuttleRowKey) translate(key));
- } else {
- setShuttleRowKey(null);
- }
- } else {
- setShuttleRowKey((ListShuttleRowKey) key);
+ public void walk(final FacesContext context, final DataVisitor visitor, final Range range,
+ final Object argument) throws IOException {
+ if (data != null) {
+ Iterator iterator = data.entrySet().iterator();
+
+ while (iterator.hasNext()) {
+ Entry entry =(Map.Entry) iterator.next();
+
+ visitor.process(context, entry.getKey(), argument);
}
- }
- }
+
+ } else {
+ sourceModel.walk(context, new DataVisitor() {
- public ListShuttleDataModel(DataModel source, DataModel target,
- boolean translatedModel, Map sourceTranslationTable, Map targetTranslationTable) {
- super();
- this.translatedModel = translatedModel;
- this.sourceTranslationTable = sourceTranslationTable;
- this.targetTranslationTable = targetTranslationTable;
+ public void process(FacesContext context, Object rowKey,
+ Object argument) throws IOException {
- this.sourceModel = new org.ajax4jsf.model.SequenceDataModel(source);
- this.targetModel = new org.ajax4jsf.model.SequenceDataModel(target);
- }
-
- private void walkModel(final FacesContext context, final DataVisitor visitor, Range range,
- Object argument, final boolean source) throws IOException {
-
- ExtendedDataModel dataModel = source ? this.sourceModel : this.targetModel;
-
- dataModel.walk(context, new DataVisitor() {
- public void process(FacesContext context, Object rowKey,
- Object argument) throws IOException {
-
- ListShuttleRowKey shuttleRowKey = new ListShuttleRowKey(rowKey, source);
- Object translatedShuttleRowKey = translate(shuttleRowKey);
-
- if (translatedModel) {
- visitor.process(context, new TranslatedRowKey(
- shuttleRowKey, String.valueOf(translatedShuttleRowKey)), argument);
- } else {
- visitor.process(context, translatedShuttleRowKey, argument);
+ ListShuttleRowKey key = new ListShuttleRowKey(rowKey, true);
+ visitor.process(context, key, argument);
}
- }
- }, new SequenceRange(0, -1), argument);
- }
+ }, range, argument);
- private void walkMap(final FacesContext context, final DataVisitor visitor, Range range,
- Object argument, Map translationMap) throws IOException {
+ targetModel.walk(context, new DataVisitor() {
- Iterator translations = translationMap.entrySet().iterator();
- while (translations.hasNext()) {
- Entry translation = (Entry) translations.next();
- ListShuttleRowKey sourceKey = (ListShuttleRowKey) translation.getKey();
- ListShuttleRowKey translatedKey = (ListShuttleRowKey) translation.getValue();
+ public void process(FacesContext context, Object rowKey,
+ Object argument) throws IOException {
- if (translatedModel) {
- visitor.process(context, new TranslatedRowKey(
- translatedKey, String.valueOf(sourceKey)), argument);
- } else {
- visitor.process(context, sourceKey, argument);
- }
+ ListShuttleRowKey key = new ListShuttleRowKey(rowKey, false);
+ visitor.process(context, key, argument);
+ }
+
+ }, range, argument);
}
}
- public void walkSource(final FacesContext context, final DataVisitor visitor, Range range,
- Object argument) throws IOException {
-
- if (this.sourceTranslationTable != null) {
- this.walkMap(context, visitor, range, argument, this.sourceTranslationTable);
+ public int getRowCount() {
+ if (data != null) {
+ return data.size();
} else {
- this.walkModel(context, visitor, range, argument, true);
+ return sourceModel.getRowCount() + targetModel.getRowCount();
}
}
-
- public void walkTarget(final FacesContext context, final DataVisitor visitor, Range range,
- Object argument) throws IOException {
- if (this.targetTranslationTable != null) {
- this.walkMap(context, visitor, range, argument, this.targetTranslationTable);
- } else {
- this.walkModel(context, visitor, range, argument, false);
- }
- }
-
- /* (non-Javadoc)
- * @see org.ajax4jsf.model.ExtendedDataModel#walk(javax.faces.context.FacesContext, org.ajax4jsf.model.DataVisitor, org.ajax4jsf.model.Range, java.lang.Object)
- */
- public void walk(final FacesContext context, final DataVisitor visitor, Range range,
- Object argument) throws IOException {
-
- walkSource(context, visitor, range, argument);
- walkTarget(context, visitor, range, argument);
- }
-
- public Object getTranslatedRowKey() {
- return this.translate(getRowKey());
- }
-
- /* (non-Javadoc)
- * @see javax.faces.model.DataModel#getRowCount()
- */
- public int getRowCount() {
- return sourceModel.getRowCount() + targetModel.getRowCount();
- }
-
- /* (non-Javadoc)
- * @see javax.faces.model.DataModel#getRowData()
- */
public Object getRowData() {
- if (isSourceModel()) {
- return sourceModel.getRowData();
- } else if (isTargetModel()) {
- return targetModel.getRowData();
+ if (data != null) {
+ return data.get(rowKey);
} else {
- return null;
+ if (this.rowKey != null) {
+ if (this.rowKey.isSource()) {
+ return sourceModel.getRowData();
+ } else {
+ return targetModel.getRowData();
+ }
+ } else {
+ return null;
+ }
}
}
- /* (non-Javadoc)
- * @see javax.faces.model.DataModel#getRowIndex()
- */
public int getRowIndex() {
- return -1;
+ // TODO Auto-generated method stub
+ return 0;
}
- /* (non-Javadoc)
- * @see javax.faces.model.DataModel#getWrappedData()
- */
public Object getWrappedData() {
- // TODO Auto-generated method stub
- return null;
+ return wrappedData;
}
- /* (non-Javadoc)
- * @see javax.faces.model.DataModel#isRowAvailable()
- */
public boolean isRowAvailable() {
- if (isSourceModel()) {
- return sourceModel.isRowAvailable();
- } else if (isTargetModel()) {
- return targetModel.isRowAvailable();
+ if (data != null) {
+ return data.containsKey(rowKey);
} else {
- return false;
+ if (rowKey != null) {
+ if (rowKey.isSource()) {
+ return sourceModel.isRowAvailable();
+ } else {
+ return targetModel.isRowAvailable();
+ }
+ } else {
+ return false;
+ }
}
}
- /* (non-Javadoc)
- * @see javax.faces.model.DataModel#setRowIndex(int)
- */
public void setRowIndex(int rowIndex) {
- }
-
- /* (non-Javadoc)
- * @see javax.faces.model.DataModel#setWrappedData(java.lang.Object)
- */
- public void setWrappedData(Object data) {
// TODO Auto-generated method stub
-
+
}
-
- public boolean needSourceTranslation() {
- return sourceTranslationTable != null;
- }
-
- public boolean needTargetTranslation() {
- return targetTranslationTable != null;
- }
- public int getSourceRowCount() {
- if (sourceTranslationTable != null) {
- return sourceTranslationTable.size();
+ public void setWrappedData(Object data) {
+ this.rowKey = null;
+ this.wrappedData = data;
+
+ if (data instanceof Map) {
+ this.data = (Map) data;
} else {
- return sourceModel.getRowCount();
+ DataModel[] models = (DataModel[]) data;
+ this.sourceModel = new SequenceDataModel(models[0]);
+ this.targetModel = new SequenceDataModel(models[1]);
}
}
- public int getTargetRowCount() {
- if (targetTranslationTable != null) {
- return targetTranslationTable.size();
- } else {
- return targetModel.getRowCount();
- }
- }
-
- protected boolean isSourceModel() {
- return Boolean.TRUE.equals(useSourceModel);
- }
-
- protected boolean isTargetModel() {
- return Boolean.FALSE.equals(useSourceModel);
- }
-
- public boolean isSource() {
- return Boolean.TRUE.equals(useSourceFacade);
- }
-
- public boolean isTarget() {
- return Boolean.FALSE.equals(useSourceFacade);
- }
-
- public void setSourceTranslationTable(Map sourceTranslationTable) {
- this.sourceTranslationTable = sourceTranslationTable;
- }
-
- public void setTargetTranslationTable(Map targetTranslationTable) {
- this.targetTranslationTable = targetTranslationTable;
- }
}
Modified: branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/model/ListShuttleRowKey.java
===================================================================
--- branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/model/ListShuttleRowKey.java 2007-12-04 05:21:18 UTC (rev 4432)
+++ branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/model/ListShuttleRowKey.java 2007-12-04 05:21:32 UTC (rev 4433)
@@ -61,7 +61,7 @@
}
public String toString() {
- return (source ? "s" : "t") + rowKey.toString();
+ return (source ? "" : "t") + rowKey.toString();
}
public ListShuttleRowKey(Object rowKey, boolean source) {
Modified: branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/renderkit/ListShuttleRendererBase.java
===================================================================
--- branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/renderkit/ListShuttleRendererBase.java 2007-12-04 05:21:18 UTC (rev 4432)
+++ branches/3.1.x/ui/listShuttle/src/main/java/org/richfaces/renderkit/ListShuttleRendererBase.java 2007-12-04 05:21:32 UTC (rev 4433)
@@ -5,11 +5,17 @@
import java.io.IOException;
import java.io.StringWriter;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
import javax.faces.component.UIColumn;
import javax.faces.component.UIComponent;
+import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
@@ -20,6 +26,7 @@
import org.richfaces.component.UIListShuttle;
import org.richfaces.component.UIOrderingBaseComponent;
import org.richfaces.component.UIOrderingBaseComponent.ItemState;
+import org.richfaces.model.ListShuttleRowKey;
/**
* @author Nick Belaevski
@@ -90,54 +97,86 @@
UIListShuttle table = (UIListShuttle) holder.getTable();
ListShuttleRendererTableHolder shuttleRendererTableHolder = (ListShuttleRendererTableHolder) holder;
- if (shuttleRendererTableHolder.isSource() && table.isSource() ||
- !shuttleRendererTableHolder.isSource() && table.isTarget()) {
-
- ResponseWriter writer = context.getResponseWriter();
- String clientId = holder.getTable().getClientId(context);
- writer.startElement(HTML.TR_ELEMENT, table);
- writer.writeAttribute("id", clientId, null);
+ ListShuttleRowKey listShuttleRowKey = (ListShuttleRowKey) table.getRowKey();
+ if (listShuttleRowKey != null) {
+ if (shuttleRendererTableHolder.isSource() == listShuttleRowKey.isFacadeSource()) {
+
+ ResponseWriter writer = context.getResponseWriter();
+ String clientId = holder.getTable().getClientId(context);
+ writer.startElement(HTML.TR_ELEMENT, table);
+ writer.writeAttribute("id", clientId, null);
- StringBuffer rowClassName = new StringBuffer("ol_normal rich-ordering-list-row");
- StringBuffer cellClassName = new StringBuffer("ol_cell rich-ordering-list-cell");
+ StringBuffer rowClassName = new StringBuffer("ol_normal rich-ordering-list-row");
+ StringBuffer cellClassName = new StringBuffer("ol_cell rich-ordering-list-cell");
- ComponentVariables variables = ComponentsVariableResolver.getVariables(this, table);
- SelectionState selectionState = (SelectionState) variables.getVariable(SELECTION_STATE_VAR_NAME);
- ItemState itemState = getItemState(context, table, variables);
-
- boolean active = itemState.isActive();
- if (active) {
- rowClassName.append(" rich-ordering-list-row-active");
- cellClassName.append(" rich-ordering-list-cell-active");
- }
-
- boolean selected = itemState.isSelected();
- selectionState.addState(selected);
- if (selected) {
- rowClassName.append(" rich-ordering-list-row-selected");
- cellClassName.append(" rich-ordering-list-cell-selected");
- }
-
- writer.writeAttribute("class", rowClassName.toString(), null);
+ ComponentVariables variables = ComponentsVariableResolver.getVariables(this, table);
+ SelectionState selectionState = (SelectionState) variables.getVariable(SELECTION_STATE_VAR_NAME);
+ ItemState itemState = getItemState(context, table, variables);
+
+ boolean active = itemState.isActive();
+ if (active) {
+ rowClassName.append(" rich-ordering-list-row-active");
+ cellClassName.append(" rich-ordering-list-cell-active");
+ }
+
+ boolean selected = itemState.isSelected();
+ selectionState.addState(selected);
+ if (selected) {
+ rowClassName.append(" rich-ordering-list-row-selected");
+ cellClassName.append(" rich-ordering-list-cell-selected");
+ }
+
+ writer.writeAttribute("class", rowClassName.toString(), null);
- List children = table.getChildren();
- for (Iterator iterator = children.iterator(); iterator.hasNext();) {
- UIComponent component = (UIComponent) iterator.next();
+ boolean columnRendered = false;
- if (component instanceof UIColumn && component.isRendered()) {
- UIColumn column = (UIColumn) component;
+ List children = table.getChildren();
+ for (Iterator iterator = children.iterator(); iterator.hasNext();) {
+ UIComponent component = (UIComponent) iterator.next();
- writer.startElement(HTML.td_ELEM, table);
+ if (component instanceof UIColumn && component.isRendered()) {
+ UIColumn column = (UIColumn) component;
- writer.writeAttribute("class", cellClassName.toString(), null);
+ writer.startElement(HTML.td_ELEM, table);
- renderChildren(context, column);
+ writer.writeAttribute("class", cellClassName.toString(), null);
- writer.endElement(HTML.td_ELEM);
+ renderChildren(context, column);
+
+ if (!columnRendered) {
+ writer.startElement(HTML.INPUT_ELEM, table);
+ writer.writeAttribute(HTML.TYPE_ATTR, HTML.INPUT_TYPE_HIDDEN, null);
+ writer.writeAttribute(HTML.NAME_ATTRIBUTE, table.getBaseClientId(context), null);
+
+ StringBuffer value = new StringBuffer();
+ value.append(table.getRowKey());
+
+ if (selected) {
+ value.append('s');
+ }
+
+ if (active) {
+ value.append('a');
+ }
+
+ value.append(':');
+ value.append(getAsString(context, table, table.getRowData()));
+
+ writer.writeAttribute(HTML.value_ATTRIBUTE, value.toString(), null);
+
+ writer.writeAttribute(HTML.id_ATTRIBUTE, clientId + "StateInput", null);
+
+ writer.endElement(HTML.INPUT_ELEM);
+
+ columnRendered = true;
+ }
+
+ writer.endElement(HTML.td_ELEM);
+ }
}
+
+ writer.endElement(HTML.TR_ELEMENT);
}
-
- writer.endElement(HTML.TR_ELEMENT);
}
}
@@ -207,18 +246,64 @@
return s == null || s.length() == 0;
}
- protected void doDecode(FacesContext context, UIComponent component) {
- super.doDecode(context, component);
+ public void doDecode(FacesContext context, UIComponent component) {
+ UIListShuttle listShuttle = (UIListShuttle) component;
+
+ String clientId = listShuttle.getBaseClientId(context);
+ ExternalContext externalContext = context.getExternalContext();
+ Map requestParameterMap = externalContext
+ .getRequestParameterMap();
+
+ if (requestParameterMap.containsKey(clientId)) {
+ Set sourceSelection = new HashSet();
+ Set targetSelection = new HashSet();
+ Object activeItem = null;
+ String[] strings = (String[]) externalContext.getRequestParameterValuesMap().get(clientId);
+ Map map = new LinkedHashMap();
+
+ boolean facadeSource = true;
+
+ for (int i = 0; i < strings.length; i++) {
+ String string = strings[i];
+
+ if (":".equals(string)) {
+ facadeSource = false;
+ continue;
+ }
+
+ int idx = string.indexOf(':');
+ Object value = getAsObject(context, listShuttle, string.substring(idx + 1));
+ String substring = string.substring(0, idx);
+
+ boolean target = false;
+ if (substring.charAt(0) == 't') {
+ target = true;
+ }
- String clientId = component.getClientId(context);
- Object object = context.getExternalContext().getRequestParameterValuesMap().get(clientId);
- if (object != null) {
- String[] submittedValues = (String[]) object;
- if (submittedValues.length == 2 && (!isEmpty(submittedValues[0]) || !isEmpty(submittedValues[1]))) {
- UIListShuttle listShuttle = (UIListShuttle) component;
- listShuttle.setSubmittedStrings(submittedValues);
- }
- }
+ boolean selected = false;
+
+ idx = substring.length() - 1;
+
+ if (substring.charAt(idx) == 'a') {
+ activeItem = value;
+ idx--;
+ }
+
+ if (substring.charAt(idx) == 's') {
+ (target ? targetSelection : sourceSelection).add(value);
+ idx--;
+ }
+
+
+ substring = substring.substring(target ? 1 : 0, idx + 1);
+
+ Object key = new ListShuttleRowKey(new Integer(substring), target, facadeSource);
+ map.put(key, value);
+ }
+ listShuttle.setSubmittedStrings(map, sourceSelection, targetSelection, activeItem);
+ } else {
+ listShuttle.setSubmittedStrings(new HashMap(0), null, null, null);
+ }
}
}
Modified: branches/3.1.x/ui/listShuttle/src/main/templates/org/richfaces/htmlListShuttle.jspx
===================================================================
--- branches/3.1.x/ui/listShuttle/src/main/templates/org/richfaces/htmlListShuttle.jspx 2007-12-04 05:21:18 UTC (rev 4432)
+++ branches/3.1.x/ui/listShuttle/src/main/templates/org/richfaces/htmlListShuttle.jspx 2007-12-04 05:21:32 UTC (rev 4433)
@@ -48,8 +48,6 @@
<table id="#{clientId}" class="rich-list-shuttle">
<tr>
<td>
- <input id="#{clientId}valueKeeper" type="hidden" name="#{clientId}" value="#{component.sourceSubmittedString}"/>
- <input id="#{clientId}tlValueKeeper" type="hidden" name="#{clientId}" value="#{component.targetSubmittedString}"/>
<div>
<input id="#{clientId}focusKeeper" type="button" value="" style="width: 1px; position: absolute; left: -32767px;" name="focusKeeper"/>
@@ -114,6 +112,8 @@
</td>
<td>
<div>
+ <input type="hidden" value=":" style="display: none;" name="#{clientId}" />
+
<input id="#{clientId}tlFocusKeeper" type="button" value="" style="width: 1px; position: absolute; left: -32767px;" name="focusKeeper"/>
<table id="#{clientId}tlTable" cellpadding="0" cellspacing="0" class="ol_body">
@@ -182,8 +182,8 @@
Event.onReady(function() {
var cotrolsIdPrefix = [['up', 'disup'], ['down', 'disdown'], ['last', 'dislast'], ['first','disfirst']];
var listShuttleCotrolsIdPrefix = [['copy', 'discopy'], ['copyAll', 'discopyAll'], ['remove', 'disremove'], ['removeAll','disremoveAll']];
- var listShuttle = new Richfaces.ListShuttle(new Richfaces.OrderingList('#{cId}', '#{cId}tlInternal_tab', '#{cId}tlInternal_header_tab', '#{cId}tlFocusKeeper', '#{cId}tlValueKeeper', cotrolsIdPrefix, '#{cId}sortLabel', function() {#{component.attributes['onorderchanged']}}),
- new Richfaces.ListBase('#{cId}', '#{cId}internal_tab', '#{cId}internal_header_tab', '#{cId}focusKeeper', '#{cId}valueKeeper'),
+ var listShuttle = new Richfaces.ListShuttle(new Richfaces.OrderingList('#{cId}', '#{cId}tlInternal_tab', '#{cId}tlInternal_header_tab', '#{cId}tlFocusKeeper', cotrolsIdPrefix, '#{cId}sortLabel', function() {#{component.attributes['onorderchanged']}}),
+ new Richfaces.ListBase('#{cId}', '#{cId}internal_tab', '#{cId}internal_header_tab', '#{cId}focusKeeper'),
"#{cId}", listShuttleCotrolsIdPrefix, "#{switchByClick}");
var sourceLayoutManager = new LayoutManager('#{cId}internal_header_tab', '#{cId}internal_tab');
var targetLayoutManager = new LayoutManager('#{cId}tlInternal_header_tab', '#{cId}tlInternal_tab');
More information about the richfaces-svn-commits
mailing list