[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