Author: abelevich
Date: 2007-12-28 08:57:16 -0500 (Fri, 28 Dec 2007)
New Revision: 5066
Modified:
trunk/sandbox/ui/pickList/src/main/java/org/richfaces/renderkit/PickListRenderer.java
Log:
add decode method
Modified:
trunk/sandbox/ui/pickList/src/main/java/org/richfaces/renderkit/PickListRenderer.java
===================================================================
---
trunk/sandbox/ui/pickList/src/main/java/org/richfaces/renderkit/PickListRenderer.java 2007-12-28
13:01:15 UTC (rev 5065)
+++
trunk/sandbox/ui/pickList/src/main/java/org/richfaces/renderkit/PickListRenderer.java 2007-12-28
13:57:16 UTC (rev 5066)
@@ -6,12 +6,17 @@
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Set;
+import javax.faces.component.EditableValueHolder;
import javax.faces.component.UIComponent;
+import javax.faces.component.UISelectMany;
+import javax.faces.component.UISelectOne;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.convert.Converter;
+import javax.faces.convert.ConverterException;
import javax.faces.model.SelectItem;
import javax.faces.model.SelectItemGroup;
@@ -60,87 +65,59 @@
return SelectUtils.getSelectItems(context, component);
}
- private void encodeSelect(FacesContext facesContext, UIComponent uiComponent, String
clientId, boolean disabled,
- int size, List selectItemsToDisplay, Converter converter, ResponseWriter
writer) throws IOException {
+ public void decode(FacesContext context, UIComponent component) {
+
+ UIPickList picklist = (UIPickList)component;
+
+ if (!(picklist instanceof EditableValueHolder)) {
+ throw new IllegalArgumentException("Component " +
picklist.getClientId(context) + " is not an EditableValueHolder");
+ }
+
+ String hiddenClientId = picklist.getClientId(context) + HIDDEN_SUFFIX;
+ Map paramValuesMap = context.getExternalContext().getRequestParameterValuesMap();
+
+ if (isDisabledOrReadOnly(picklist)) {
+ return;
+ }
+
+ if (paramValuesMap.containsKey(hiddenClientId)) {
+ String[] valuesInline = (String[]) paramValuesMap.get(hiddenClientId);
+
+ if (valuesInline[0].trim().equals("")) {
+ ((EditableValueHolder) picklist).setSubmittedValue(new String[] {});
+ } else {
+ String[] reqValues = valuesInline[0].split(",");
+ ((EditableValueHolder) picklist).setSubmittedValue(reqValues);
+ }
+ } else {
+ ((EditableValueHolder) picklist).setSubmittedValue(new String[] {});
+ }
+ }
- writer.startElement("select", uiComponent);
- writer.writeAttribute("id", clientId, "id");
- writer.writeAttribute("name", clientId, null);
- writer.writeAttribute("multiple", "true", null);
+ private boolean isDisabledOrReadOnly(UIPickList picklist) {
+ return picklist.isDisplayValueOnly() ||
isTrue(picklist.getAttributes().get("disabled"));
+ }
- if (size == 0) {
- writer.writeAttribute("size", Integer.toString(selectItemsToDisplay.size()),
null);
+ private static boolean isTrue(Object obj) {
+ if (!(obj instanceof Boolean)) {
+ return false;
+ }
+ return ((Boolean) obj).booleanValue();
+ }
+
+ @Override
+ public Object getConvertedValue(FacesContext context, UIComponent component, Object
submittedValue)
+ throws ConverterException {
+
+ if ((component instanceof UISelectMany) && (submittedValue instanceof
String[])) {
+ return SelectUtils.getConvertedUISelectManyValue(context,(UISelectMany)component,
(String [])submittedValue);
+ } else if ((component instanceof UISelectOne) && (submittedValue instanceof
String)) {
+ return SelectUtils.getConvertedUIInputValue(context, (UISelectOne)component,
(String)submittedValue);
} else {
- writer.writeAttribute("size", Integer.toString(size), null);
- }
- if (disabled) {
- writer.writeAttribute(HTML.DISABLED_ATTR, Boolean.TRUE, null);
- }
+ throw new IllegalArgumentException("Unsupported component class " +
component.getClass().getName());
+ }
- renderSelectOptions(facesContext, uiComponent, converter, Collections.EMPTY_SET,
selectItemsToDisplay);
- writer.writeText("", null);
- writer.endElement("select");
}
-
- public void renderSelectOptions(FacesContext context, UIComponent component, Converter
converter, Set lookupSet,
- List selectItemList) throws IOException {
- ResponseWriter writer = context.getResponseWriter();
-
- for (Iterator it = selectItemList.iterator(); it.hasNext();) {
- SelectItem selectItem = (SelectItem) it.next();
-
- if (selectItem instanceof SelectItemGroup) {
- writer.startElement("optgroup", component);
- writer.writeAttribute("label", selectItem.getLabel(), null);
- SelectItem[] selectItems = ((SelectItemGroup) selectItem).getSelectItems();
- renderSelectOptions(context, component, converter, lookupSet,
Arrays.asList(selectItems));
- writer.endElement("optgroup");
- } else {
- String itemStrValue = PickListUtils.getConvertedStringValue(context, component,
converter, selectItem.getValue());
- writer.write('\t');
- writer.startElement("option", component);
-
- if (itemStrValue != null) {
- writer.writeAttribute(HTML.value_ATTRIBUTE, itemStrValue, null);
- }
-
- if (lookupSet.contains(itemStrValue))
- { //TODO/FIX: we always compare the String vales, better fill lookupSet with Strings
only when useSubmittedValue==true, else use the real item value Objects
- writer.writeAttribute("selected", "selected", null);
- }
-
- boolean disabled = selectItem.isDisabled();
- if (disabled) {
- writer.writeAttribute(HTML.DISABLED_ATTR, HTML.DISABLED_ATTR, null);
- }
-
- String labelClass;
- boolean componentDisabled =
((Boolean)component.getAttributes().get("disabled")).booleanValue();
-
- if (componentDisabled || disabled) {
- labelClass = (String) component.getAttributes().get("disabledClass");
- } else {
- labelClass = (String) component.getAttributes().get("enabled");
- }
-
- if (labelClass != null) {
- writer.writeAttribute("class", labelClass, "labelClass");
- }
-
- Boolean booleanValue = (Boolean)component.getAttributes().get("escape");
- boolean escape = booleanValue != null ? booleanValue.booleanValue():true; //default
is to escape
-
- if (escape) {
- writer.writeText(selectItem.getLabel(), null);
- } else {
- writer.write(selectItem.getLabel());
- }
-
- writer.endElement("option");
- }
- }
- }
-
@Override
protected void doEncodeEnd(ResponseWriter writer, FacesContext context, UIComponent
component) throws IOException {
@@ -196,6 +173,84 @@
writer.endElement(HTML.TR_ELEMENT);
writer.endElement("table");
}
+
+ private void encodeSelect(FacesContext facesContext, UIComponent uiComponent, String
clientId, boolean disabled,
+ int size, List selectItemsToDisplay, Converter converter, ResponseWriter writer)
throws IOException {
+
+ writer.startElement("select", uiComponent);
+ writer.writeAttribute("id", clientId, "id");
+ writer.writeAttribute("name", clientId, null);
+ writer.writeAttribute("multiple", "true", null);
+
+ if (size == 0) {
+ writer.writeAttribute("size", Integer.toString(selectItemsToDisplay.size()),
null);
+ } else {
+ writer.writeAttribute("size", Integer.toString(size), null);
+ }
+ if (disabled) {
+ writer.writeAttribute(HTML.DISABLED_ATTR, Boolean.TRUE, null);
+ }
+
+ renderSelectOptions(facesContext, uiComponent, converter, Collections.EMPTY_SET,
selectItemsToDisplay);
+ writer.writeText("", null);
+ writer.endElement("select");
+ }
+
+ public void renderSelectOptions(FacesContext context, UIComponent component, Converter
converter, Set lookupSet,
+ List selectItemList) throws IOException {
+ ResponseWriter writer = context.getResponseWriter();
+
+ for (Iterator it = selectItemList.iterator(); it.hasNext();) {
+ SelectItem selectItem = (SelectItem) it.next();
+
+ if (selectItem instanceof SelectItemGroup) {
+ writer.startElement("optgroup", component);
+ writer.writeAttribute("label", selectItem.getLabel(), null);
+ SelectItem[] selectItems = ((SelectItemGroup) selectItem).getSelectItems();
+ renderSelectOptions(context, component, converter, lookupSet,
Arrays.asList(selectItems));
+ writer.endElement("optgroup");
+ } else {
+ String itemStrValue = PickListUtils.getConvertedStringValue(context, component,
converter, selectItem.getValue());
+ writer.write('\t');
+ writer.startElement("option", component);
+
+ if (itemStrValue != null) {
+ writer.writeAttribute(HTML.value_ATTRIBUTE, itemStrValue, null);
+ }
+
+ if (lookupSet.contains(itemStrValue)) { //TODO/FIX: we always compare the String
vales, better fill lookupSet with Strings only when useSubmittedValue==true, else use the
real item value Objects
+ writer.writeAttribute("selected", "selected", null);
+ }
+
+ boolean disabled = selectItem.isDisabled();
+ if (disabled) {
+ writer.writeAttribute(HTML.DISABLED_ATTR, HTML.DISABLED_ATTR, null);
+ }
+
+ boolean componentDisabled =
isTrue(component.getAttributes().get("disabled"));
+ String labelClass = null;
+ if (componentDisabled || disabled) {
+ labelClass = (String) component.getAttributes().get("disabledClass");
+ } else {
+ labelClass = (String) component.getAttributes().get("enabled");
+ }
+
+ if (labelClass != null) {
+ writer.writeAttribute("class", labelClass, "labelClass");
+ }
+
+ boolean escape = isTrue(component.getAttributes().get("escape"));
+
+ if (escape) {
+ writer.writeText(selectItem.getLabel(), null);
+ } else {
+ writer.write(selectItem.getLabel());
+ }
+
+ writer.endElement("option");
+ }
+ }
+ }
private void encodeSwapButton(FacesContext facesContext, UIComponent uiComponent,
String javaScriptFunction,
String text,ResponseWriter writer) throws IOException {
@@ -230,7 +285,7 @@
writer.endElement(HTML.INPUT_ELEM);
}
-
+
protected Class<? extends UIComponent> getComponentClass() {
return UIPickList.class;
}