You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2009/11/24 21:53:57 UTC
svn commit: r883869 - in
/myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit:
JSFAttr.java RendererUtils.java html/HtmlCheckboxRendererBase.java
html/HtmlRadioRendererBase.java html/HtmlRendererUtils.java
Author: lu4242
Date: Tue Nov 24 20:53:56 2009
New Revision: 883869
URL: http://svn.apache.org/viewvc?rev=883869&view=rev
Log:
MYFACES-2418 Implement h:selectManyXXX collectionType and hideNoSelectionOption (thanks to Jakob Korherr for this patch)
Modified:
myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/JSFAttr.java
myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/RendererUtils.java
myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlCheckboxRendererBase.java
myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java
myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java
Modified: myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/JSFAttr.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/JSFAttr.java?rev=883869&r1=883868&r2=883869&view=diff
==============================================================================
--- myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/JSFAttr.java (original)
+++ myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/JSFAttr.java Tue Nov 24 20:53:56 2009
@@ -63,11 +63,12 @@
String SIZE_ATTR = "size";
// SelectMany Checkbox List/ Select One Radio Attributes
- String BORDER_ATTR = "border";
- String DISABLED_CLASS_ATTR = "disabledClass";
- String ENABLED_CLASS_ATTR = "enabledClass";
- String SELECTED_CLASS_ATTR = "selectedClass";
- String UNSELECTED_CLASS_ATTR = "unselectedClass";
+ String BORDER_ATTR = "border";
+ String DISABLED_CLASS_ATTR = "disabledClass";
+ String ENABLED_CLASS_ATTR = "enabledClass";
+ String SELECTED_CLASS_ATTR = "selectedClass";
+ String UNSELECTED_CLASS_ATTR = "unselectedClass";
+ String HIDE_NO_SELECTION_OPTION_ATTR = "hideNoSelectionOption";
// Common Command Attributes
/**@deprecated */
Modified: myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/RendererUtils.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/RendererUtils.java?rev=883869&r1=883868&r2=883869&view=diff
==============================================================================
--- myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/RendererUtils.java (original)
+++ myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/RendererUtils.java Tue Nov 24 20:53:56 2009
@@ -677,16 +677,16 @@
}
return set;
}
- else if (values instanceof List)
+ else if (values instanceof Collection)
{
- List lst = (List)values;
- if (lst.size() == 0)
+ Collection col = (Collection)values;
+ if (col.size() == 0)
{
return Collections.EMPTY_SET;
}
- HashSet set = new HashSet(HashMapUtils.calcCapacity(lst.size()));
- for (Iterator i = lst.iterator(); i.hasNext();)
+ HashSet set = new HashSet(HashMapUtils.calcCapacity(col.size()));
+ for (Iterator i = col.iterator(); i.hasNext();)
set.add(getConvertedStringValue(context, component, converter, i.next()));
return set;
Modified: myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlCheckboxRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlCheckboxRendererBase.java?rev=883869&r1=883868&r2=883869&view=diff
==============================================================================
--- myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlCheckboxRendererBase.java (original)
+++ myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlCheckboxRendererBase.java Tue Nov 24 20:53:56 2009
@@ -126,11 +126,9 @@
.iterator(); it.hasNext();) {
SelectItem selectItem = (SelectItem) it.next();
- renderGroupOrItemCheckbox(facesContext, selectMany,
- selectItem, useSubmittedValues, lookupSet,
- converter, pageDirectionLayout, new Integer(itemNum));
-
- itemNum++;
+ itemNum = renderGroupOrItemCheckbox(facesContext, selectMany,
+ selectItem, useSubmittedValues, lookupSet,
+ converter, pageDirectionLayout, itemNum);
}
if (!pageDirectionLayout)
@@ -146,7 +144,20 @@
return (String) selectMany.getAttributes().get(JSFAttr.LAYOUT_ATTR);
}
- protected void renderGroupOrItemCheckbox(FacesContext facesContext,
+ /**
+ *
+ * @param facesContext
+ * @param uiComponent
+ * @param selectItem
+ * @param useSubmittedValues
+ * @param lookupSet
+ * @param converter
+ * @param pageDirectionLayout
+ * @param itemNum
+ * @return the itemNum for the next option
+ * @throws IOException
+ */
+ protected int renderGroupOrItemCheckbox(FacesContext facesContext,
UIComponent uiComponent, SelectItem selectItem,
boolean useSubmittedValues, Set lookupSet,
Converter converter, boolean pageDirectionLayout, Integer itemNum) throws IOException
@@ -156,12 +167,8 @@
boolean isSelectItemGroup = (selectItem instanceof SelectItemGroup);
- Object itemValue = selectItem.getValue(); // TODO : Check here for getSubmittedValue. Look at RendererUtils.getValue
-
UISelectMany selectMany = (UISelectMany) uiComponent;
- String itemStrValue = org.apache.myfaces.shared.renderkit.RendererUtils.getConvertedStringValue(facesContext, selectMany, converter, itemValue);
-
if (isSelectItemGroup)
{
if (pageDirectionLayout)
@@ -180,17 +187,21 @@
writer.startElement(HTML.TABLE_ELEM, selectMany);
writer.writeAttribute(HTML.BORDER_ATTR, "0", null);
+
+ if(!pageDirectionLayout)
+ writer.startElement(HTML.TR_ELEM, selectMany);
SelectItemGroup group = (SelectItemGroup) selectItem;
SelectItem[] selectItems = group.getSelectItems();
-
- for (int i = 0; i < selectItems.length; i++)
+
+ for (SelectItem groupSelectItem : selectItems)
{
- renderGroupOrItemCheckbox(facesContext, selectMany, selectItems[i], useSubmittedValues, lookupSet, converter, pageDirectionLayout, new Integer(i));
+ itemNum = renderGroupOrItemCheckbox(facesContext, selectMany, groupSelectItem, useSubmittedValues,
+ lookupSet, converter, pageDirectionLayout, itemNum);
}
- writer.endElement(HTML.TD_ELEM);
- writer.endElement(HTML.TR_ELEM);
+ if(!pageDirectionLayout)
+ writer.endElement(HTML.TR_ELEM);
writer.endElement(HTML.TABLE_ELEM);
writer.endElement(HTML.TD_ELEM);
@@ -200,14 +211,27 @@
}
else
{
+ Object itemValue = selectItem.getValue(); // TODO : Check here for getSubmittedValue. Look at RendererUtils.getValue
+ String itemStrValue = org.apache.myfaces.shared.renderkit.RendererUtils.getConvertedStringValue(facesContext, selectMany, converter, itemValue);
+
+ boolean checked = lookupSet.contains(itemStrValue);
+
+ // IF the hideNoSelectionOption attribute of the component is true
+ // AND this selectItem is the "no selection option"
+ // AND there are currently selected items
+ // AND this item (the "no selection option") is not selected
+ if (HtmlRendererUtils.isHideNoSelectionOption(uiComponent) && selectItem.isNoSelectionOption()
+ && lookupSet.size() != 0 && !checked)
+ {
+ // do not render this selectItem
+ return itemNum;
+ }
writer.write("\t\t");
if (pageDirectionLayout)
writer.startElement(HTML.TR_ELEM, selectMany);
writer.startElement(HTML.TD_ELEM, selectMany);
- boolean checked = lookupSet.contains(itemStrValue);
-
boolean disabled = selectItem.isDisabled();
String itemId = renderCheckbox(facesContext, selectMany, itemStrValue, disabled, checked, false, itemNum);
@@ -221,7 +245,12 @@
writer.endElement(HTML.TD_ELEM);
if (pageDirectionLayout)
writer.endElement(HTML.TR_ELEM);
+
+ // we rendered one checkbox --> increment itemNum
+ itemNum++;
}
+
+ return itemNum;
}
@Deprecated
Modified: myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java?rev=883869&r1=883868&r2=883869&view=diff
==============================================================================
--- myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java (original)
+++ myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java Tue Nov 24 20:53:56 2009
@@ -104,11 +104,9 @@
{
SelectItem selectItem = (SelectItem)it.next();
- renderGroupOrItemRadio(facesContext, selectOne,
- selectItem, currentValue,
- converter, pageDirectionLayout, new Integer(itemNum));
-
- itemNum++;
+ itemNum = renderGroupOrItemRadio(facesContext, selectOne,
+ selectItem, currentValue,
+ converter, pageDirectionLayout, itemNum);
}
if (!pageDirectionLayout) writer.endElement(HTML.TR_ELEM);
@@ -138,11 +136,16 @@
}
- protected void renderGroupOrItemRadio(FacesContext facesContext,
- UIComponent uiComponent, SelectItem selectItem,
- Object currentValue,
- Converter converter, boolean pageDirectionLayout,
- Integer itemNum) throws IOException{
+ /**
+ * Renders the given SelectItem(Group)
+ * @return the itemNum for the next item
+ */
+ protected int renderGroupOrItemRadio(FacesContext facesContext,
+ UIComponent uiComponent, SelectItem selectItem,
+ Object currentValue,
+ Converter converter, boolean pageDirectionLayout,
+ Integer itemNum) throws IOException
+ {
ResponseWriter writer = facesContext.getResponseWriter();
@@ -154,7 +157,8 @@
UISelectOne selectOne = (UISelectOne)uiComponent;
- if (isSelectItemGroup) {
+ if (isSelectItemGroup)
+ {
if (pageDirectionLayout)
writer.startElement(HTML.TR_ELEM, selectOne);
@@ -170,47 +174,67 @@
writer.startElement(HTML.TABLE_ELEM, selectOne);
writer.writeAttribute(HTML.BORDER_ATTR, "0", null);
+
+ if(!pageDirectionLayout)
+ writer.startElement(HTML.TR_ELEM, selectOne);
SelectItemGroup group = (SelectItemGroup) selectItem;
SelectItem[] selectItems = group.getSelectItems();
- for (int i=0; i<selectItems.length; i++) {
- renderGroupOrItemRadio(facesContext, selectOne, selectItems[i], currentValue, converter,
- pageDirectionLayout, new Integer(i));
+ for (SelectItem groupSelectItem : selectItems)
+ {
+ itemNum = renderGroupOrItemRadio(facesContext, selectOne, groupSelectItem, currentValue,
+ converter, pageDirectionLayout, itemNum);
}
- writer.endElement(HTML.TD_ELEM);
- writer.endElement(HTML.TR_ELEM);
+ if(!pageDirectionLayout)
+ writer.endElement(HTML.TR_ELEM);
writer.endElement(HTML.TABLE_ELEM);
writer.endElement(HTML.TD_ELEM);
if (pageDirectionLayout)
writer.endElement(HTML.TR_ELEM);
- } else {
-
- writer.write("\t\t");
- if (pageDirectionLayout)
- writer.startElement(HTML.TR_ELEM, selectOne);
- writer.startElement(HTML.TD_ELEM, selectOne);
-
- String itemStrValue = org.apache.myfaces.shared.renderkit.RendererUtils.getConvertedStringValue(facesContext, selectOne, converter, selectItem.getValue());
- boolean itemDisabled = selectItem.isDisabled();
-
- boolean itemChecked = itemStrValue.equals(currentValue);
-
- String itemId = renderRadio(facesContext, selectOne, itemStrValue, itemDisabled, itemChecked, false, itemNum);
-
- // label element after the input
- boolean componentDisabled = isDisabled(facesContext, selectOne);
- boolean disabled = (componentDisabled || itemDisabled);
-
- HtmlRendererUtils.renderLabel(writer, selectOne, itemId, selectItem, disabled);
-
- writer.endElement(HTML.TD_ELEM);
- if (pageDirectionLayout)
- writer.endElement(HTML.TR_ELEM);
+ }
+ else
+ {
+ String itemStrValue = org.apache.myfaces.shared.renderkit.RendererUtils.getConvertedStringValue(facesContext, selectOne, converter, selectItem.getValue());
+ boolean itemChecked = itemStrValue.equals(currentValue);
+
+ // IF the hideNoSelectionOption attribute of the component is true
+ // AND this selectItem is the "no selection option"
+ // AND there are currently selected items
+ // AND this item (the "no selection option") is not selected
+ if (HtmlRendererUtils.isHideNoSelectionOption(uiComponent) && selectItem.isNoSelectionOption()
+ && currentValue != null && !"".equals(currentValue) && !itemChecked)
+ {
+ // do not render this selectItem
+ return itemNum;
+ }
+
+ writer.write("\t\t");
+ if (pageDirectionLayout)
+ writer.startElement(HTML.TR_ELEM, selectOne);
+ writer.startElement(HTML.TD_ELEM, selectOne);
+
+ boolean itemDisabled = selectItem.isDisabled();
+
+ String itemId = renderRadio(facesContext, selectOne, itemStrValue, itemDisabled, itemChecked, false, itemNum);
+
+ // label element after the input
+ boolean componentDisabled = isDisabled(facesContext, selectOne);
+ boolean disabled = (componentDisabled || itemDisabled);
+
+ HtmlRendererUtils.renderLabel(writer, selectOne, itemId, selectItem, disabled);
+
+ writer.endElement(HTML.TD_ELEM);
+ if (pageDirectionLayout)
+ writer.endElement(HTML.TR_ELEM);
+
+ // we rendered one radio --> increment itemNum
+ itemNum++;
}
+ return itemNum;
}
@Deprecated
Modified: myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java?rev=883869&r1=883868&r2=883869&view=diff
==============================================================================
--- myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java (original)
+++ myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRendererUtils.java Tue Nov 24 20:53:56 2009
@@ -518,6 +518,9 @@
UIComponent component, Converter converter, Set lookupSet,
List selectItemList) throws IOException {
ResponseWriter writer = context.getResponseWriter();
+
+ // check for the hideNoSelectionOption attribute
+ boolean hideNoSelectionOption = isHideNoSelectionOption(component);
for (Iterator it = selectItemList.iterator(); it.hasNext();) {
SelectItem selectItem = (SelectItem) it.next();
@@ -533,15 +536,29 @@
writer.endElement(HTML.OPTGROUP_ELEM);
} else {
String itemStrValue = org.apache.myfaces.shared.renderkit.RendererUtils.getConvertedStringValue(context, component,
- converter, selectItem);
-
+ converter, selectItem);
+ boolean selected = 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
+
+ // IF the hideNoSelectionOption attribute of the component is true
+ // AND this selectItem is the "no selection option"
+ // AND there are currently selected items
+ // AND this item (the "no selection option") is not selected
+ // (if there is currently no value on UISelectOne, lookupSet contains "")
+ if (hideNoSelectionOption && selectItem.isNoSelectionOption()
+ && lookupSet.size() != 0 && !(lookupSet.size() == 1 && lookupSet.contains(""))
+ && !selected)
+ {
+ // do not render this selectItem
+ continue;
+ }
+
writer.write(TABULATOR);
writer.startElement(HTML.OPTION_ELEM, component);
if (itemStrValue != null) {
writer.writeAttribute(HTML.VALUE_ATTR, 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
+ if (selected) {
writer.writeAttribute(HTML.SELECTED_ATTR,
HTML.SELECTED_ATTR, null);
}
@@ -2489,6 +2506,20 @@
writer.endElement(HTML.SCRIPT_ELEM);
}
+
+ /**
+ * Returns the value of the hideNoSelectionOption attribute of the given UIComponent
+ * @param component
+ * @return
+ */
+ public static boolean isHideNoSelectionOption(UIComponent component)
+ {
+ // check hideNoSelectionOption for literal value (String) or ValueExpression (Boolean)
+ Object hideNoSelectionOptionAttr = component.getAttributes().get(JSFAttr.HIDE_NO_SELECTION_OPTION_ATTR);
+ return ((hideNoSelectionOptionAttr instanceof String && "true".equalsIgnoreCase((String) hideNoSelectionOptionAttr))
+ || (hideNoSelectionOptionAttr instanceof Boolean && ((Boolean) hideNoSelectionOptionAttr)));
+ }
+
/**
* The ScriptContext offers methods and fields
* to help with rendering out a script and keeping a