This is an automated email from the ASF dual-hosted git repository.

doebele pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/master by this push:
     new 74d89b9  EMPIREDB-355 render SelectOneListbox instead of SelectOneMenu 
if format attribute size ist greater than one
74d89b9 is described below

commit 74d89b9fc228e04305e7d71943c229baa22f27ec
Author: Rainer Döbele <[email protected]>
AuthorDate: Sat May 22 20:23:41 2021 +0200

    EMPIREDB-355
    render SelectOneListbox instead of SelectOneMenu if format attribute size 
ist greater than one
---
 .../apache/empire/jsf2/components/SelectTag.java   | 77 +++++++++++++---------
 .../empire/jsf2/controls/SelectInputControl.java   | 72 ++++++++++++++------
 2 files changed, 100 insertions(+), 49 deletions(-)

diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/SelectTag.java 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/SelectTag.java
index 412e5d6..95acf1f 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/SelectTag.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/components/SelectTag.java
@@ -25,6 +25,8 @@ import java.util.Map;
 import javax.el.ValueExpression;
 import javax.faces.component.NamingContainer;
 import javax.faces.component.UIInput;
+import javax.faces.component.UISelectOne;
+import javax.faces.component.html.HtmlSelectOneListbox;
 import javax.faces.component.html.HtmlSelectOneMenu;
 import javax.faces.component.visit.VisitCallback;
 import javax.faces.component.visit.VisitContext;
@@ -246,15 +248,14 @@ public class SelectTag extends UIInput implements 
NamingContainer
         if (getChildCount() > 0)
         {
             inputComponent = getInputComponent();
-            if (inputComponent instanceof HtmlSelectOneMenu)
+            if (inputComponent instanceof UISelectOne)
             {
                 this.control = (SelectInputControl) 
InputControlManager.getControl(SelectInputControl.NAME);
                 // disabled
-                boolean disabled = isDisabled();
-                ((HtmlSelectOneMenu) inputComponent).setDisabled(disabled);
+                setInputDisabled((UISelectOne)inputComponent, isDisabled());
                 // Options (sync)
-                control.syncOptions((HtmlSelectOneMenu) inputComponent, 
textResolver, selectInputInfo);
-                setInputValue((HtmlSelectOneMenu) inputComponent);
+                control.syncOptions((UISelectOne) inputComponent, 
textResolver, selectInputInfo);
+                setInputValue((UISelectOne) inputComponent);
             }
             else
             { // Something's wrong here?
@@ -366,19 +367,14 @@ public class SelectTag extends UIInput implements 
NamingContainer
             throw new InvalidPropertyException("inputControl", 
getInputControl());
         // create component
         this.control = (SelectInputControl)inputControl; 
-        HtmlSelectOneMenu input = control.createMenuComponent(this);
-        // css style
-        String userStyle = 
StringUtils.toString(getAttributes().get("styleClass"));
-        String cssStyle = 
TagEncodingHelper.assembleStyleClassString("eSelect", null, null, userStyle);
-        input.setStyleClass(cssStyle);
+        Object size = getAttributes().get("size");
+        UISelectOne input = control.createSelectComponent(this, 
FacesContext.getCurrentInstance(), size);
         // other attributes
         copyAttributes(input);
-        input.setId(SELECT_COMPONENT_ID);
         // Options
         control.initOptions(input, textResolver, selectInputInfo);
         // disabled
-        boolean disabled = isDisabled();
-        input.setDisabled(disabled);
+        boolean disabled = setInputDisabled(input, isDisabled());
         control.addRemoveDisabledStyle(input, disabled);
         // input.setLabel(getLabelString());
         // input.setRequired(col.isRequired() && !col.isAutoGenerated());
@@ -387,7 +383,7 @@ public class SelectTag extends UIInput implements 
NamingContainer
         return input;
     }
 
-    protected void setInputValue(HtmlSelectOneMenu input)
+    protected void setInputValue(UISelectOne input)
     {
         Object value = getValue();
         if (value != null)
@@ -400,11 +396,11 @@ public class SelectTag extends UIInput implements 
NamingContainer
         input.setValue(value);
     }
 
-    protected void copyAttributes(HtmlSelectOneMenu input)
+    protected void copyAttributes(UISelectOne input)
     {
         // set id
         String inputId = this.getId();
-        if (StringUtils.isNotEmpty(inputId))
+        if (StringUtils.isNotEmpty(inputId) && !inputId.startsWith("j_"))
         { // remove trailing underscore (workaround since parent and child may 
not have the same name)
             if (inputId.endsWith("_"))
             {
@@ -412,21 +408,21 @@ public class SelectTag extends UIInput implements 
NamingContainer
             }
             input.setId(inputId);
         }
-
-        Map<String, Object> attr = getAttributes();
-        Object value;
-        if ((value = attr.get("style")) != null)
-        {
-            input.setStyle(StringUtils.toString(value));
-        }
-        if ((value = attr.get("tabindex")) != null)
-        {
-            input.setTabindex(StringUtils.toString(value));
-        }
-        if ((value = attr.get("onchange")) != null)
-        {
-            input.setOnchange(StringUtils.toString(value));
+        else
+        {   // always set to CompoentID
+            input.setId(SELECT_COMPONENT_ID);
         }
+        
+        Map<String, Object> tagMap = getAttributes();
+        Map<String, Object> inputMap = input.getAttributes();
+        // css style
+        String userStyle = StringUtils.toString(tagMap.get("styleClass"));
+        String cssStyle = 
TagEncodingHelper.assembleStyleClassString("eSelect", null, null, userStyle);
+        inputMap.put("styleClass", cssStyle);
+        // other
+        copyAttribute(inputMap, tagMap, "style");
+        copyAttribute(inputMap, tagMap, "tabindex");
+        copyAttribute(inputMap, tagMap, "onchange");
     }
     
     protected void addAttachedObjects(FacesContext context, UIInput 
inputComponent)
@@ -442,4 +438,25 @@ public class SelectTag extends UIInput implements 
NamingContainer
         if (aoh!=null)
             aoh.updateAttachedObjects(this, context, null, inputComponent);
     }
+    
+    protected boolean setInputDisabled(UISelectOne input, boolean disabled)
+    {
+        if (input instanceof HtmlSelectOneMenu)
+            ((HtmlSelectOneMenu)input).setDisabled(disabled);
+        else if (input instanceof HtmlSelectOneListbox)
+            ((HtmlSelectOneListbox)input).setDisabled(disabled);
+        else
+            log.warn("Unable to set disabled attribute!");
+        return disabled;
+    }
+    
+    protected void copyAttribute(Map<String, Object> inputMap, Map<String, 
Object> tagMap, String name)
+    {
+        Object value = tagMap.get(name);
+        if (value==null) // Empty String must be allowed!
+            return;
+        // set
+        inputMap.put(name, String.valueOf(value));
+    }
+    
 }
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/SelectInputControl.java
 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/SelectInputControl.java
index be78fed..619cf5e 100644
--- 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/SelectInputControl.java
+++ 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/SelectInputControl.java
@@ -24,6 +24,8 @@ import java.util.List;
 import javax.el.ValueExpression;
 import javax.faces.component.UIComponent;
 import javax.faces.component.UISelectItem;
+import javax.faces.component.UISelectOne;
+import javax.faces.component.html.HtmlSelectOneListbox;
 import javax.faces.component.html.HtmlSelectOneMenu;
 import javax.faces.context.FacesContext;
 import javax.faces.event.PhaseId;
@@ -47,25 +49,44 @@ public class SelectInputControl extends InputControl
 
     public static final String  VALUE_EXPRESSION_FLAG = 
"VALUE_EXPRESSION_FLAG";
 
+    public static final String  FORMAT_SIZE           = "size:";
+
+    public static final String  FORMAT_SIZE_ATTR      = "format:size";
+    
     public static final String  NAME                  = "select";
 
-    private final Class<? extends HtmlSelectOneMenu> inputComponentClass;
+    private final Class<? extends HtmlSelectOneMenu> menuComponentClass;
+
+    private final Class<? extends HtmlSelectOneListbox> listComponentClass;
     
-    public SelectInputControl(String name, Class<? extends HtmlSelectOneMenu> 
inputComponentClass)
+    public SelectInputControl(String name, Class<? extends HtmlSelectOneMenu> 
menuComponentClass, Class<? extends HtmlSelectOneListbox> listComponentClass)
     {
         super(name);
-        this.inputComponentClass = inputComponentClass;
+        this.menuComponentClass = menuComponentClass;
+        this.listComponentClass = listComponentClass;
     }
 
     public SelectInputControl()
     {
-        this(SelectInputControl.NAME, HtmlSelectOneMenu.class);
+        this(SelectInputControl.NAME, HtmlSelectOneMenu.class, 
HtmlSelectOneListbox.class);
     }
 
     /* for SelectTag (when no column is available) */ 
-    public HtmlSelectOneMenu createMenuComponent(UIComponent parent)
+    public UISelectOne createSelectComponent(UIComponent parent, FacesContext 
context, Object formatSize)
     {
-        return 
InputControlManager.createComponent(FacesContext.getCurrentInstance(), 
this.inputComponentClass);
+        Class<? extends UISelectOne> selectOneClass;
+        int listSize = ObjectUtils.getInteger(formatSize, 1);
+        if (listSize==-1 || listSize>1)
+            selectOneClass = this.listComponentClass;
+        else
+            selectOneClass = this.menuComponentClass;
+        // create now
+        UISelectOne selectOne = InputControlManager.createComponent(context, 
selectOneClass);
+        // set list size
+        if ((selectOne instanceof HtmlSelectOneListbox) && listSize>1)
+            ((HtmlSelectOneListbox)selectOne).setSize(listSize);
+        // done
+        return selectOne;
     }
 
     @Override
@@ -74,16 +95,16 @@ public class SelectInputControl extends InputControl
         // check params
         if (!compList.isEmpty())
             throw new InvalidArgumentException("compList", compList);
-        // create
-        HtmlSelectOneMenu input = InputControlManager.createComponent(context, 
this.inputComponentClass);
+        // create list or menu
+        Object formatSize = getFormatOption(ii, FORMAT_SIZE, FORMAT_SIZE_ATTR);
+        UISelectOne input = createSelectComponent(parent, context, formatSize);
         // setValueExpressionFlag
         Object value = ii.getValue(false);
         input.getAttributes().put(SelectInputControl.VALUE_EXPRESSION_FLAG, 
(value instanceof ValueExpression));
         // copy Attributes
         copyAttributes(parent, ii, input);
         // disabled
-        boolean disabled = ii.isDisabled();
-        input.setDisabled(disabled);
+        boolean disabled = setDisabled(input, ii);
         // Options
         initOptions(input, ii.getTextResolver(), ii);
         // add
@@ -99,16 +120,15 @@ public class SelectInputControl extends InputControl
     protected void updateInputState(List<UIComponent> compList, InputInfo ii, 
FacesContext context, PhaseId phaseId)
     {
         UIComponent comp = compList.get(0);
-        if (!(comp instanceof HtmlSelectOneMenu))
+        if (!(comp instanceof UISelectOne))
         {
             throw new 
UnexpectedReturnValueException(comp.getClass().getName(), 
"parent.getChildren()");
         }
-        HtmlSelectOneMenu input = (HtmlSelectOneMenu)comp;
+        UISelectOne input = (UISelectOne)comp;
         // required
        addRemoveStyle(input, InputControl.STYLECLASS_REQUIRED, 
ii.isRequired());
         // disabled
-        boolean disabled = ii.isDisabled();
-        input.setDisabled(disabled);
+       boolean disabled = setDisabled(input, ii);
         // check phase
         if (phaseId!=PhaseId.APPLY_REQUEST_VALUES)
         {   // Options (sync)
@@ -122,9 +142,23 @@ public class SelectInputControl extends InputControl
             setInputValue(input, ii);
         }
     }
+    
+    protected boolean setDisabled(UISelectOne input, InputInfo ii)
+    {
+        boolean disabled = ii.isDisabled();
+        if (input instanceof HtmlSelectOneMenu)
+            ((HtmlSelectOneMenu)input).setDisabled(disabled);
+        else if (input instanceof HtmlSelectOneListbox)
+            ((HtmlSelectOneListbox)input).setDisabled(disabled);
+        else
+            log.warn("Unable to set disabled attribute!");
+        return disabled;
+    }
 
-    protected boolean isEmptyEntryRequired(Options options, InputInfo ii, 
Object currentValue)
+    protected boolean isEmptyEntryRequired(UISelectOne input, Options options, 
InputInfo ii, Object currentValue)
     {
+        if (input instanceof HtmlSelectOneListbox)
+            return false; // not for listbox
         if (options!=null && options.containsNull())
         {   // already has an empty option
             return false;
@@ -147,7 +181,7 @@ public class SelectInputControl extends InputControl
         return ObjectUtils.isEmpty(currentValue);
     }
 
-    public void initOptions(HtmlSelectOneMenu input, TextResolver 
textResolver, InputInfo ii)
+    public void initOptions(UISelectOne input, TextResolver textResolver, 
InputInfo ii)
     {
         // get the options
         Options options = ii.getOptions();
@@ -161,7 +195,7 @@ public class SelectInputControl extends InputControl
         }
         // current 
         Object currentValue = ii.getValue(true);
-        if (isEmptyEntryRequired(options, ii, currentValue))
+        if (isEmptyEntryRequired(input, options, ii, currentValue))
         {   // Empty entry
             addSelectItem(input, textResolver, new OptionEntry(null, 
getNullText(ii)));
         }
@@ -181,7 +215,7 @@ public class SelectInputControl extends InputControl
         }
     }
     
-    public void syncOptions(HtmlSelectOneMenu input, TextResolver 
textResolver, InputInfo ii)
+    public void syncOptions(UISelectOne input, TextResolver textResolver, 
InputInfo ii)
     {
         // get the options
         Options options = ii.getOptions();
@@ -194,7 +228,7 @@ public class SelectInputControl extends InputControl
             return;
         }
         Object currentValue = ii.getValue(true);
-        boolean hasEmpty = isEmptyEntryRequired(options, ii, currentValue);
+        boolean hasEmpty = isEmptyEntryRequired(input, options, ii, 
currentValue);
         // boolean isInsideUIData = ii.isInsideUIData();
         // Compare child-items with options
         Iterator<OptionEntry> ioe = options.iterator();

Reply via email to