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();