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