EMPIREDB-348
Rework disabled / readonly
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 575fb00..412e5d6 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
@@ -40,6 +40,7 @@
 import org.apache.empire.jsf2.app.TextResolver;

 import org.apache.empire.jsf2.controls.InputAttachedObjectsHandler;

 import org.apache.empire.jsf2.controls.InputControl;

+import org.apache.empire.jsf2.controls.InputControl.DisabledType;

 import org.apache.empire.jsf2.controls.InputControl.InputInfo;

 import org.apache.empire.jsf2.controls.InputControlManager;

 import org.apache.empire.jsf2.controls.SelectInputControl;

@@ -155,9 +156,9 @@
         }

 

         @Override

-        public boolean isFieldReadOnly()

+        public DisabledType getDisabled()

         {

-            return false;

+            return (SelectTag.this.isDisabled() ? DisabledType.DISABLED : DisabledType.NO);

         }

 

         @Override

diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/CheckboxInputControl.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/CheckboxInputControl.java
index 20fc7e9..1d6b129 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/CheckboxInputControl.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/CheckboxInputControl.java
@@ -30,6 +30,7 @@
 import org.apache.empire.commons.ObjectUtils;

 import org.apache.empire.exceptions.InvalidArgumentException;

 import org.apache.empire.exceptions.UnexpectedReturnValueException;

+import org.apache.empire.jsf2.controls.InputControl.DisabledType;

 

 public class CheckboxInputControl extends InputControl

 {

@@ -96,21 +97,12 @@
         }

         HtmlSelectBooleanCheckbox input = (HtmlSelectBooleanCheckbox) comp;

         // disabled

-        Object dis = ii.getAttributeEx("disabled");

-        if (dis != null)

-        {

-            input.setDisabled(ObjectUtils.getBoolean(dis));

-        }

-        // field-readOnly

-        if (ObjectUtils.getBoolean(dis) == false)

-        {

-            input.setReadonly(ii.isFieldReadOnly());

-            input.setDisabled(ii.isFieldReadOnly());

-        }

+        boolean disabled = ii.isDisabled();

+        input.setDisabled(disabled);

         // check phase

         if (phaseId==PhaseId.RENDER_RESPONSE)

         {   // style

-            addRemoveDisabledStyle(input, input.isDisabled());

+            addRemoveDisabledStyle(input, disabled);

             // set value

             setInputValue(input, ii);

         }

diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/InputControl.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/InputControl.java
index f940c72..38b902a 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/InputControl.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/InputControl.java
@@ -87,6 +87,17 @@
     }

 

     /**

+     * DisabledType

+     * @author doebele

+     */

+    public enum DisabledType 

+    {

+        NO,

+        READONLY,

+        DISABLED;

+    }

+    

+    /**

      * This interface allows access to a value and its metainformation

      * used with the renderData function

      */

@@ -137,7 +148,7 @@
         

         boolean isDisabled(); // disabled or readOnly

 

-        boolean isFieldReadOnly(); // not disabled only readOnly (for input[type=text] only!)

+        DisabledType getDisabled();

         // input

 

         String getInputId();

diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/RadioInputControl.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/RadioInputControl.java
index 5231521..feb929d 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/RadioInputControl.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/RadioInputControl.java
@@ -39,6 +39,7 @@
 import org.apache.empire.exceptions.InvalidArgumentException;

 import org.apache.empire.exceptions.UnexpectedReturnValueException;

 import org.apache.empire.jsf2.app.TextResolver;

+import org.apache.empire.jsf2.controls.InputControl.DisabledType;

 import org.slf4j.Logger;

 import org.slf4j.LoggerFactory;

 

@@ -137,7 +138,7 @@
         // add

         compList.add(input);

         // style

-        addRemoveDisabledStyle(input, input.isDisabled());

+        addRemoveDisabledStyle(input, disabled);

         addRemoveInvalidStyle(input, ii.hasError());

         // Set Value

         setInputValue(input, ii);

@@ -165,7 +166,7 @@
         }

         if (phaseId==PhaseId.RENDER_RESPONSE)

         {   // style

-            addRemoveDisabledStyle(input, input.isDisabled());

+            addRemoveDisabledStyle(input, disabled);

             addRemoveInvalidStyle(input, ii.hasError());

             // set value

             setInputValue(input, ii);

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 9f39584..be78fed0 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
@@ -82,14 +82,14 @@
         // copy Attributes

         copyAttributes(parent, ii, input);

         // disabled

-        boolean disabled = ii.isDisabled() || ii.isFieldReadOnly();

+        boolean disabled = ii.isDisabled();

         input.setDisabled(disabled);

         // Options

         initOptions(input, ii.getTextResolver(), ii);

         // add

         compList.add(input);

         // style

-        addRemoveDisabledStyle(input, input.isDisabled());

+        addRemoveDisabledStyle(input, disabled);

         addRemoveInvalidStyle(input, ii.hasError());

         // Set Value

         setInputValue(input, ii);

@@ -116,7 +116,7 @@
         }

         if (phaseId==PhaseId.RENDER_RESPONSE)

         {   // style

-            addRemoveDisabledStyle(input, input.isDisabled());

+            addRemoveDisabledStyle(input, disabled);

             addRemoveInvalidStyle(input, ii.hasError());

             // set value

             setInputValue(input, ii);

diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/TextAreaInputControl.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/TextAreaInputControl.java
index ed890d5..02a713e 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/TextAreaInputControl.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/TextAreaInputControl.java
@@ -30,6 +30,7 @@
 import org.apache.empire.commons.StringUtils;

 import org.apache.empire.exceptions.InvalidArgumentException;

 import org.apache.empire.exceptions.UnexpectedReturnValueException;

+import org.apache.empire.jsf2.controls.InputControl.DisabledType;

 import org.apache.empire.jsf2.controls.InputControl.ValueInfo;

 

 public class TextAreaInputControl extends InputControl

@@ -107,16 +108,15 @@
         }

         HtmlInputTextarea input = (HtmlInputTextarea)comp;

         // disabled

-        Object dis = ii.getAttributeEx("disabled");

-        if (dis!=null)

-            input.setDisabled(ObjectUtils.getBoolean(dis));

-        // field-readOnly

-        if (ObjectUtils.getBoolean(dis)==false)

-            input.setReadonly(ii.isFieldReadOnly());

+        DisabledType disabled = ii.getDisabled();

+        if (disabled!=null)

+        {   input.setReadonly((disabled==DisabledType.READONLY));

+            input.setDisabled((disabled==DisabledType.DISABLED));

+        }

         // Set Value

         if (phaseId==PhaseId.RENDER_RESPONSE)

         {   // style

-            addRemoveDisabledStyle(input, (input.isDisabled() || input.isReadonly()));

+            addRemoveDisabledStyle(input, (disabled!=null && disabled!=DisabledType.NO));

             addRemoveInvalidStyle(input, ii.hasError());

             // set value

             setInputValue(input, ii);

diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/TextInputControl.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/TextInputControl.java
index ad71344..479ae51 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/TextInputControl.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/controls/TextInputControl.java
@@ -43,6 +43,7 @@
 import org.apache.empire.data.DataType;

 import org.apache.empire.exceptions.InvalidArgumentException;

 import org.apache.empire.exceptions.UnexpectedReturnValueException;

+import org.apache.empire.jsf2.controls.InputControl.DisabledType;

 import org.slf4j.Logger;

 import org.slf4j.LoggerFactory;

 

@@ -126,20 +127,15 @@
         // modified

         addRemoveStyle(input, InputControl.STYLECLASS_MODIFIED, ii.isModified());

         // disabled

-        Object dis = ii.getAttributeEx("disabled");

-        if (dis != null)

-        {

-            input.setDisabled(ObjectUtils.getBoolean(dis));

-        }

-        // field-readOnly

-        if (ObjectUtils.getBoolean(dis) == false)

-        {

-            input.setReadonly(ii.isFieldReadOnly());

+        DisabledType disabled = ii.getDisabled();

+        if (disabled!=null)

+        {   input.setReadonly((disabled==DisabledType.READONLY));

+            input.setDisabled((disabled==DisabledType.DISABLED));

         }

         // set value

         if (phaseId==PhaseId.RENDER_RESPONSE)

         {   // style

-            addRemoveDisabledStyle(input, (input.isDisabled() || input.isReadonly()));

+            addRemoveDisabledStyle(input, (disabled!=null && disabled!=DisabledType.NO));

             addRemoveInvalidStyle(input, ii.hasError());

             // set value

             setInputValue(input, ii);

diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
index 8fea07a..3c52da4 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/utils/TagEncodingHelper.java
@@ -69,6 +69,7 @@
 import org.apache.empire.jsf2.components.LinkTag;

 import org.apache.empire.jsf2.components.RecordTag;

 import org.apache.empire.jsf2.controls.InputControl;

+import org.apache.empire.jsf2.controls.InputControl.DisabledType;

 import org.apache.empire.jsf2.controls.InputControlManager;

 import org.apache.empire.jsf2.controls.SelectInputControl;

 import org.apache.empire.jsf2.controls.TextAreaInputControl;

@@ -79,6 +80,7 @@
 public class TagEncodingHelper implements NamingContainer

 {

     private final static String SPACE = " ";

+    

     /**

      * ColumnExprWrapper

      * wraps a ColumnExpr object into a Column interface object

@@ -341,21 +343,14 @@
         @Override

         public boolean isDisabled()

         {

-            // check attribute

-            Object val = getAttributeValueEx("disabled");

-            if (val != null && ObjectUtils.getBoolean(val))

-                return true;

-            // not disabeld

-            return false;

+            DisabledType disabled = TagEncodingHelper.this.getDisabled(); 

+            return (disabled!=null && disabled!=DisabledType.NO);

         }

-

+        

         @Override

-        public boolean isFieldReadOnly()

-        {   // Check tag

-            if (!(component instanceof UIInput))

-                return true;

-            // column read only

-            return TagEncodingHelper.this.isReadOnly();

+        public DisabledType getDisabled()

+        {            

+            return TagEncodingHelper.this.getDisabled();

         }

         

         @Override

@@ -816,12 +811,9 @@
         }

         // check attribute

         Object val = getTagAttributeValue("readonly");

-        if (val != null)

-        {   // check

-            if (StringUtils.valueOf(val).equalsIgnoreCase("never"))

-                return false;

-            if (ObjectUtils.getBoolean(val))

-                return true;

+        if (!ObjectUtils.isEmpty(val))

+        {   // override

+            return ObjectUtils.getBoolean(val);

         }

         // check record component

         if (recordTag != null && recordTag.isReadOnly())

@@ -857,6 +849,11 @@
 

     public boolean isReadOnly()

     {

+        // component 

+        if (!(component instanceof UIInput))

+        {   log.warn("Component is not of type UIInput");

+            return true;

+        }

         // Check Record

         if (isRecordReadOnly())

             return true;

@@ -869,6 +866,27 @@
         // column

         return getColumn().isReadOnly();

     }

+    

+    public DisabledType getDisabled()

+    {

+        // component 

+        if (!(component instanceof UIInput))

+        {   log.warn("Component is not of type UIInput");

+            return DisabledType.READONLY;

+        }

+        // Check attribute

+        Object dis = getAttributeValueEx("disabled");

+        if (ObjectUtils.isEmpty(dis))

+            return null; // not provided!

+        // direct

+        if (dis instanceof DisabledType)

+            return (DisabledType)dis;

+        // readonly

+        if (String.valueOf(dis).equalsIgnoreCase("readonly"))

+            return DisabledType.READONLY;

+        // other

+        return (ObjectUtils.getBoolean(dis) ? DisabledType.DISABLED : DisabledType.NO);

+    }

 

     public boolean isValueRequired()

     {