Author: nbelaevski
Date: 2007-11-27 21:27:04 -0500 (Tue, 27 Nov 2007)
New Revision: 4302
Modified:
branches/3.1.x/ui/orderingList/src/main/config/component/orderinglist.xml
branches/3.1.x/ui/orderingList/src/main/java/org/richfaces/component/UIOrderingList.java
branches/3.1.x/ui/orderingList/src/main/java/org/richfaces/model/TranslatedSequenceDataModel.java
Log:
latest changes for orderingList & listShuttle
Modified: branches/3.1.x/ui/orderingList/src/main/config/component/orderinglist.xml
===================================================================
--- branches/3.1.x/ui/orderingList/src/main/config/component/orderinglist.xml 2007-11-28
00:50:15 UTC (rev 4301)
+++ branches/3.1.x/ui/orderingList/src/main/config/component/orderinglist.xml 2007-11-28
02:27:04 UTC (rev 4302)
@@ -101,14 +101,6 @@
<defaultvalue><![CDATA[""]]></defaultvalue>
</property>
<property>
- <name>headerLabel</name>
- <classname>java.lang.String</classname>
- <description>
- Defines text, which is placed inside a header.
- </description>
- <defaultvalue><![CDATA[""]]></defaultvalue>
- </property>
- <property>
<name>controlsType</name>
<classname>java.lang.String</classname>
<description>
@@ -286,6 +278,22 @@
<description>HTML: a script expression; </description>
<defaultvalue><![CDATA[""]]></defaultvalue>
</property>
+
+ <property hidden="true">
+ <name>header</name>
+ </property>
+ <property hidden="true">
+ <name>footer</name>
+ </property>
+ <property hidden="true">
+ <name>first</name>
+ </property>
+ <property hidden="true">
+ <name>rowIndex</name>
+ </property>
+ <property hidden="true">
+ <name>rowCount</name>
+ </property>
</component>
<listener>
Modified:
branches/3.1.x/ui/orderingList/src/main/java/org/richfaces/component/UIOrderingList.java
===================================================================
---
branches/3.1.x/ui/orderingList/src/main/java/org/richfaces/component/UIOrderingList.java 2007-11-28
00:50:15 UTC (rev 4301)
+++
branches/3.1.x/ui/orderingList/src/main/java/org/richfaces/component/UIOrderingList.java 2007-11-28
02:27:04 UTC (rev 4302)
@@ -1,5 +1,6 @@
package org.richfaces.component;
+import java.io.IOException;
import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.ArrayList;
@@ -7,8 +8,11 @@
import java.util.Collections;
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 java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -32,102 +36,105 @@
import javax.faces.validator.ValidatorException;
import org.ajax4jsf.javascript.ScriptUtils;
+import org.ajax4jsf.model.DataVisitor;
import org.ajax4jsf.model.ExtendedDataModel;
import org.richfaces.model.TranslatedSequenceDataModel;
public abstract class UIOrderingList extends UIOrderingBaseComponent {
+ private transient Map permutationOrder;
+
protected static final class SubmittedValue implements Serializable {
/**
*
*/
private static final long serialVersionUID = 5860506816451180551L;
- private int[] permutationOrder;
+ private Map permutationOrder;
private Set selectedItems = new HashSet();
private Integer activeItem;
-
+
public SubmittedValue(String submittedString) {
super();
fromString(submittedString);
}
private void fromString(String string) {
- String[] valueOrder = string.split(",");
- permutationOrder = new int[valueOrder.length];
- for (int i = 0; i < valueOrder.length; i++) {
- Matcher matcher =
Pattern.compile("(\\d+)(s?a?)").matcher(valueOrder[i]);
- matcher.matches();
-
- try {
- permutationOrder[i] = Integer.valueOf(matcher.group(1)).intValue();
- String group = matcher.group(2);
- for (int j = 0; j < group.length(); j++) {
+ String[] valueOrder = string.split(",");
+ permutationOrder = new LinkedHashMap(valueOrder.length);
+ for (int i = 0; i < valueOrder.length; i++) {
+ Matcher matcher = Pattern.compile("(\\d+)(s?a?)").matcher(valueOrder[i]);
+ matcher.matches();
+
+ try {
+ Integer oldKey = Integer.valueOf(matcher.group(1));
+ Integer newKey = new Integer(i);
+ permutationOrder.put(oldKey, newKey);
+ String group = matcher.group(2);
+ for (int j = 0; j < group.length(); j++) {
char c = group.charAt(j);
- if ('s' == c) {
- selectedItems.add(new Integer(permutationOrder[i]));
+ if ('s' == c) {
+ selectedItems.add(oldKey);
} else if ('a' == c) {
- activeItem = new Integer(permutationOrder[i]);
+ activeItem = oldKey;
} else {
break ;
}
-
+
}
- } catch (NumberFormatException e) {
- throw new FacesException(e.getLocalizedMessage(), e);
+ } catch (NumberFormatException e) {
+ throw new FacesException(e.getLocalizedMessage(), e);
}
- }
+ }
}
-
+
public String toString() {
StringBuffer result = new StringBuffer();
- for (int i = 0; i < permutationOrder.length; i++) {
- result.append(permutationOrder[i]);
+ Iterator iterator = permutationOrder.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Entry entry = (Entry) iterator.next();
- Integer key = new Integer(permutationOrder[i]);
-
+ Object key = entry.getKey();
+
+ result.append(key);
if (selectedItems.contains(key)) {
result.append('s');
}
-
+
if (key.equals(activeItem)) {
result.append('a');
}
- if (i < permutationOrder.length - 1) {
- result.append(',');
- }
+ if (iterator.hasNext()) {
+ result.append(',');
+ }
}
return result.toString();
}
- public int[] getPermutationOrder() {
- return permutationOrder;
- }
-
}
-
+
public interface ItemState {
public boolean isSelected();
public boolean isActive();
}
-
+
private final class SubmittedItemState implements ItemState {
-
+
public boolean isActive() {
return submittedValueHolder.activeItem != null &&
- submittedValueHolder.activeItem.equals(getTranslatedRowKey());
+ submittedValueHolder.activeItem.equals(getTranslatedRowKey());
}
public boolean isSelected() {
return submittedValueHolder.selectedItems != null &&
- submittedValueHolder.selectedItems.contains(getTranslatedRowKey());
+ submittedValueHolder.selectedItems.contains(getTranslatedRowKey());
}
}
-
+
private final class ModelItemState implements ItemState {
private Collection selectedItems;
private Object activeItem;
-
+
public ModelItemState(Collection selectedItems, Object activeItem) {
super();
this.selectedItems = selectedItems;
@@ -137,24 +144,24 @@
public boolean isSelected() {
return selectedItems != null && selectedItems.contains(getRowData());
}
-
+
public boolean isActive() {
return activeItem != null && activeItem.equals(getRowData());
}
}
-
+
protected ExtendedDataModel createDataModel() {
DataModel dataModel = createDataModel(getValue());
-
+
if (isTranslatedRenderingState() || isTranslatedState()) {
- return new TranslatedSequenceDataModel(dataModel, isTranslatedState(),
submittedValueHolder != null ? submittedValueHolder.permutationOrder : null);
+ return new TranslatedSequenceDataModel(dataModel, isTranslatedState(),
submittedValueHolder != null ? submittedValueHolder.permutationOrder :
this.permutationOrder);
} else {
return new TranslatedSequenceDataModel(dataModel, false, null);
}
}
private transient SubmittedValue submittedValueHolder = null;
-
+
public void addValueChangeListener(ValueChangeListener listener) {
addFacesListener(listener);
}
@@ -176,16 +183,16 @@
public void removeValueChangeListener(ValueChangeListener listener) {
removeFacesListener(listener);
}
-
-
+
+
public String getSubmittedString() {
return submittedValueHolder != null ? submittedValueHolder.toString() : "";
}
-
+
public void setSubmittedString(String submittedString) {
this.submittedValueHolder = new SubmittedValue(submittedString);
}
-
+
protected Object saveIterationSubmittedState() {
return submittedValueHolder;
}
@@ -193,14 +200,15 @@
protected void restoreIterationSubmittedState(Object object) {
this.submittedValueHolder = (SubmittedValue) object;
}
-
+
protected Object saveIterationState() {
- return null;
+ return permutationOrder;
}
-
+
protected void restoreIterationState(Object object) {
+ this.permutationOrder = (Map) object;
}
-
+
public abstract void setImmediate(boolean immediate);
public abstract void setRequired(boolean required);
@@ -320,7 +328,7 @@
}
}
-
+
/**
* <p>Perform the following algorithm to update the model data
* associated with this {@link UIInput}, if any, as appropriate.</p>
@@ -421,7 +429,7 @@
Object newValue = null;
try {
- newValue = getConvertedValue();
+ newValue = getConvertedValue(context);
}
catch (ConverterException ce) {
Object submittedValue = submittedValueHolder;
@@ -434,18 +442,16 @@
// If our value is valid, store the new value, erase the
// "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();) {
+ .hasNext();) {
setRowKey(context, iterator.next());
Object selectionItem = getRowData();
-
+
selectionSet.add(selectionItem);
}
-
+
setSelection(selectionSet);
if (submittedValueHolder.activeItem != null) {
@@ -456,7 +462,7 @@
} else {
setActiveItem(null);
}
-
+
Object previous = getValue();
setValue(newValue);
setTranslatedState();
@@ -465,57 +471,79 @@
queueEvent(new ValueChangeEvent(this, previous, newValue));
}
+ this.permutationOrder = this.submittedValueHolder.permutationOrder;
this.submittedValueHolder = null;
-
- setRowKey(rowKey);
}
}
- protected Object getConvertedValue() throws ConverterException {
+ protected Object getConvertedValue(FacesContext context) throws ConverterException {
Object convertedValue = getValue();
if (convertedValue == null) {
convertedValue = Collections.EMPTY_LIST;
}
-
+
if (submittedValueHolder != null) {
Object savedValue = convertedValue;
-
- int[] indexes = submittedValueHolder.permutationOrder;
-
- if (savedValue instanceof List) {
- List list = (List) savedValue;
- ArrayList arrayList = new ArrayList(list.size());
- for (int i = 0; i < indexes.length; i++) {
- int j = indexes[i];
- arrayList.add(list.get(j));
+
+ //int[] indexes = submittedValueHolder.permutationOrder;
+
+ TranslatedSequenceDataModel dataModel = (TranslatedSequenceDataModel)
getExtendedDataModel();
+ dataModel.setTranslationTable(submittedValueHolder.permutationOrder);
+
+ try {
+ if (savedValue instanceof List) {
+ List list = (List) savedValue;
+ final ArrayList arrayList = new ArrayList(list.size());
+
+ walk(context, new DataVisitor() {
+
+ public void process(FacesContext context, Object rowKey,
+ Object argument) throws IOException {
+
+ setRowKey(rowKey);
+ arrayList.add(getRowData());
+ }
+
+ }, null);
+
+ convertedValue = arrayList;
+ } else {
+ final Object[] convertedValueArray = (Object[])
Array.newInstance(savedValue.getClass().getComponentType(),
+ Array.getLength(savedValue));
+
+ walk(context, new DataVisitor() {
+ private int counter = 0;
+
+ public void process(FacesContext context, Object rowKey,
+ Object argument) throws IOException {
+
+ setRowKey(rowKey);
+ convertedValueArray[counter++] = getRowData();
+ }
+
+ }, null);
+
+ convertedValue = convertedValueArray;
}
- convertedValue = arrayList;
- } else {
- Object[] savedValueArray = (Object[]) savedValue;
- Object[] convertedValueArray = (Object[])
Array.newInstance(savedValue.getClass().getComponentType(),
- Array.getLength(savedValue));
- convertedValue = convertedValueArray;
-
- for (int i = 0; i < indexes.length; i++) {
- convertedValueArray[i] = savedValueArray[indexes[i]];
- }
+ } catch (IOException e) {
+ throw new ConverterException(e.getLocalizedMessage(), e);
}
-
- //submittedValueHolder.newValue = convertedValue;
}
-
+
return convertedValue;
}
protected void resetDataModel() {
super.resetDataModel();
+ this.permutationOrder = null;
+
if (this.submittedValueHolder != null) {
setTranslatedRenderingState();
}
}
-
+
/**
*
* <p>Set the "valid" property according to the below
algorithm.</p>
@@ -609,10 +637,10 @@
public Object getTranslatedRowKey() {
return ((TranslatedSequenceDataModel) getExtendedDataModel()).getTranslatedRowKey();
}
-
+
public String getElementsOrder() {
Object order = null;
-
+
if (isTranslatedRenderingState()) {
if (this.submittedValueHolder != null) {
order = this.submittedValueHolder.permutationOrder;
@@ -621,7 +649,7 @@
return ScriptUtils.toScript(order);
}
-
+
public ItemState getItemState() {
if (submittedValueHolder != null) {
return new SubmittedItemState();
@@ -629,22 +657,22 @@
return new ModelItemState(getSelection(), getActiveItem());
}
}
-
+
/*public abstract boolean isOrderControlsVisible();
public abstract void setOrderControlsVisible(boolean visible);
-
+
public abstract boolean isFastOrderControlsVisible();
public abstract void setFastOrderControlsVisible(boolean visible);*/
-
+
public abstract String getControlsType();
public abstract void setControlsType(String type);
-
+
public abstract int getListWidth();
-
+
public abstract void setListWidth(int listWidth);
-
+
public abstract int getListHeight();
-
+
public abstract void setListHeight(int listHeight);
}
Modified:
branches/3.1.x/ui/orderingList/src/main/java/org/richfaces/model/TranslatedSequenceDataModel.java
===================================================================
---
branches/3.1.x/ui/orderingList/src/main/java/org/richfaces/model/TranslatedSequenceDataModel.java 2007-11-28
00:50:15 UTC (rev 4301)
+++
branches/3.1.x/ui/orderingList/src/main/java/org/richfaces/model/TranslatedSequenceDataModel.java 2007-11-28
02:27:04 UTC (rev 4302)
@@ -4,6 +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;
@@ -21,16 +24,16 @@
public class TranslatedSequenceDataModel extends SequenceDataModel {
protected static final class TranslatedRowKey {
- private Integer key;
+ private Object key;
private String asString;
- public TranslatedRowKey(Integer key, String asString) {
+ public TranslatedRowKey(Object key, String asString) {
super();
this.key = key;
this.asString = asString;
}
- public Integer getKey() {
+ public Object getKey() {
return key;
}
@@ -43,13 +46,13 @@
}
};
- private int[] translationTable;
+ private Map translationTable;
private boolean translatedModel;
private Object rowKey;
public TranslatedSequenceDataModel(DataModel wrapped,
- boolean translatedModel, int[] translationTable) {
+ boolean translatedModel, Map translationTable) {
super(wrapped);
this.translatedModel = translatedModel;
this.translationTable = translationTable;
@@ -59,11 +62,11 @@
super(wrapped);
}
- private int translate(int i) {
+ private Object translate(Object key) {
if (translationTable != null) {
- return translationTable[i];
+ return translationTable.get(key);
} else {
- return i;
+ return key;
}
}
@@ -83,8 +86,7 @@
} else {
if (this.translatedModel) {
if (rowKey != null) {
- int iKey = ((Integer) key).intValue();
- super.setRowKey(new Integer(translate(iKey)));
+ super.setRowKey(translate(key));
} else {
super.setRowKey(null);
}
@@ -97,13 +99,32 @@
public void walk(FacesContext context, DataVisitor visitor, Range range,
Object argument) throws IOException {
- for (int i = 0; i < getRowCount(); i++) {
- if (this.translatedModel) {
- visitor.process(context, new TranslatedRowKey(
- new Integer(i), String.valueOf(translate(i))), argument);
- } else {
- visitor.process(context, new Integer(translate(i)), argument);
+ if (this.translationTable != null) {
+ Iterator iterator = this.translationTable.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Entry entry = (Entry) iterator.next();
+
+ if (this.translatedModel) {
+ visitor.process(context, new TranslatedRowKey(
+ entry.getValue(), String.valueOf(entry.getKey())), argument);
+ } else {
+ visitor.process(context, entry.getKey(), argument);
+ }
}
+ } else {
+ for (int i = 0; i < getRowCount(); i++) {
+ if (this.translatedModel) {
+ Integer key = new Integer(i);
+ visitor.process(context, new TranslatedRowKey(
+ translate(key), String.valueOf(key)), argument);
+ } else {
+ visitor.process(context, new Integer(i), argument);
+ }
+ }
}
}
+
+ public void setTranslationTable(Map translationTable) {
+ this.translationTable = translationTable;
+ }
}