]> source.dussan.org Git - vaadin-framework.git/commitdiff
Keep all checkbox related data in Map don't address it via the index #11772
authorDenis Anisimov <denis@vaadin.com>
Mon, 7 Apr 2014 19:04:33 +0000 (22:04 +0300)
committerVaadin Code Review <review@vaadin.com>
Wed, 21 May 2014 12:36:29 +0000 (12:36 +0000)
Change-Id: I2c9c68134d9fe958e2881975d1d845dea819a761

client/src/com/vaadin/client/ui/VOptionGroup.java
uitest/src/com/vaadin/tests/components/optiongroup/ReadOnlyOptionGroup.java [new file with mode: 0644]
uitest/src/com/vaadin/tests/components/optiongroup/ReadOnlyOptionGroupTest.java [new file with mode: 0644]

index 52da725a004f9e15ebfd60d7ee0435637df44519..34227831b9b5c8fc89e7e6277fe8469ec9b3153d 100644 (file)
@@ -57,7 +57,7 @@ public class VOptionGroup extends VOptionGroupBase implements FocusHandler,
 
     private final Map<CheckBox, String> optionsToKeys;
 
-    private final List<Boolean> optionsEnabled;
+    private final Map<CheckBox, Boolean> optionsEnabled;
 
     /** For internal use only. May be removed or replaced in the future. */
     public boolean sendFocusEvents = false;
@@ -94,7 +94,7 @@ public class VOptionGroup extends VOptionGroupBase implements FocusHandler,
         super(CLASSNAME);
         panel = (Panel) optionsContainer;
         optionsToKeys = new HashMap<CheckBox, String>();
-        optionsEnabled = new ArrayList<Boolean>();
+        optionsEnabled = new HashMap<CheckBox, Boolean>();
 
         wasMultiselect = isMultiselect();
     }
@@ -176,7 +176,7 @@ public class VOptionGroup extends VOptionGroupBase implements FocusHandler,
                     .getBooleanAttribute(OptionGroupConstants.ATTRIBUTE_OPTION_DISABLED);
             boolean enabled = optionEnabled && !isReadonly() && isEnabled();
             op.setEnabled(enabled);
-            optionsEnabled.add(optionEnabled);
+            optionsEnabled.put(op, optionEnabled);
 
             setStyleName(op.getElement(),
                     ApplicationConnection.DISABLED_CLASSNAME,
@@ -239,19 +239,26 @@ public class VOptionGroup extends VOptionGroupBase implements FocusHandler,
 
     @Override
     protected void updateEnabledState() {
-        int i = 0;
         boolean optionGroupEnabled = isEnabled() && !isReadonly();
         // sets options enabled according to the widget's enabled,
         // readonly and each options own enabled
         for (Widget w : panel) {
             if (w instanceof HasEnabled) {
-                ((HasEnabled) w).setEnabled(optionsEnabled.get(i)
-                        && optionGroupEnabled);
-                setStyleName(w.getElement(),
-                        ApplicationConnection.DISABLED_CLASSNAME,
-                        !(optionsEnabled.get(i) && isEnabled()));
+                HasEnabled hasEnabled = (HasEnabled) w;
+                Boolean isOptionEnabled = optionsEnabled.get(w);
+                if (isOptionEnabled == null) {
+                    hasEnabled.setEnabled(optionGroupEnabled);
+                    setStyleName(w.getElement(),
+                            ApplicationConnection.DISABLED_CLASSNAME,
+                            !isEnabled());
+                } else {
+                    hasEnabled
+                            .setEnabled(isOptionEnabled && optionGroupEnabled);
+                    setStyleName(w.getElement(),
+                            ApplicationConnection.DISABLED_CLASSNAME,
+                            !(isOptionEnabled && isEnabled()));
+                }
             }
-            i++;
         }
     }
 
diff --git a/uitest/src/com/vaadin/tests/components/optiongroup/ReadOnlyOptionGroup.java b/uitest/src/com/vaadin/tests/components/optiongroup/ReadOnlyOptionGroup.java
new file mode 100644 (file)
index 0000000..76258e5
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.optiongroup;
+
+import java.util.Collections;
+
+import com.vaadin.data.Property;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.CheckBox;
+import com.vaadin.ui.OptionGroup;
+
+/**
+ * Test UI for unset read-only flag of Option group with new items allowed.
+ * 
+ * @author Vaadin Ltd
+ */
+public class ReadOnlyOptionGroup extends AbstractTestUI {
+
+    @Override
+    protected void setup(VaadinRequest request) {
+        final OptionGroup optionGroup = new OptionGroup("test field",
+                Collections.singletonList("Option"));
+        optionGroup.setNewItemsAllowed(true);
+
+        final CheckBox readOnlyCheckbox = new CheckBox("read-only");
+        readOnlyCheckbox.setImmediate(true);
+        readOnlyCheckbox
+                .addValueChangeListener(new Property.ValueChangeListener() {
+                    @Override
+                    public void valueChange(Property.ValueChangeEvent event) {
+                        optionGroup.setReadOnly(readOnlyCheckbox.getValue());
+                    }
+                });
+        readOnlyCheckbox.setValue(Boolean.TRUE);
+
+        addComponent(optionGroup);
+        addComponent(readOnlyCheckbox);
+    }
+
+    @Override
+    protected String getTestDescription() {
+        return "Unset read-only state for Option group should not throw an exception";
+    }
+
+    @Override
+    protected Integer getTicketNumber() {
+        return 11772;
+    }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/optiongroup/ReadOnlyOptionGroupTest.java b/uitest/src/com/vaadin/tests/components/optiongroup/ReadOnlyOptionGroupTest.java
new file mode 100644 (file)
index 0000000..dfafe8f
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.optiongroup;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ * Test for Option group (with new items allowed): unset read only state.
+ * 
+ * @author Vaadin Ltd
+ */
+public class ReadOnlyOptionGroupTest extends MultiBrowserTest {
+
+    @Test
+    public void testOptionGroup() {
+        setDebug(true);
+        openTestURL();
+
+        WebElement checkbox = driver.findElement(By.className("v-checkbox"));
+        WebElement checkboxInput = checkbox.findElement(By.tagName("input"));
+        checkboxInput.click();
+
+        Assert.assertFalse("There is a client side exception after unset "
+                + "readonly mode for option group",
+                isElementPresent(By.className("v-Notification-error")));
+
+        Assert.assertFalse("Radio button in option group is still disabled "
+                + "after unset reaonly",
+                isElementPresent(By.className("v-radiobutton-disabled")));
+    }
+
+}