From b0e35fc1ddd999f07e9f0acbd8bf18b8a05813d7 Mon Sep 17 00:00:00 2001 From: Denis Anisimov Date: Mon, 7 Apr 2014 22:04:33 +0300 Subject: Keep all checkbox related data in Map don't address it via the index #11772 Change-Id: I2c9c68134d9fe958e2881975d1d845dea819a761 --- client/src/com/vaadin/client/ui/VOptionGroup.java | 27 +++++---- .../optiongroup/ReadOnlyOptionGroup.java | 64 ++++++++++++++++++++++ .../optiongroup/ReadOnlyOptionGroupTest.java | 50 +++++++++++++++++ 3 files changed, 131 insertions(+), 10 deletions(-) create mode 100644 uitest/src/com/vaadin/tests/components/optiongroup/ReadOnlyOptionGroup.java create mode 100644 uitest/src/com/vaadin/tests/components/optiongroup/ReadOnlyOptionGroupTest.java diff --git a/client/src/com/vaadin/client/ui/VOptionGroup.java b/client/src/com/vaadin/client/ui/VOptionGroup.java index 52da725a00..34227831b9 100644 --- a/client/src/com/vaadin/client/ui/VOptionGroup.java +++ b/client/src/com/vaadin/client/ui/VOptionGroup.java @@ -57,7 +57,7 @@ public class VOptionGroup extends VOptionGroupBase implements FocusHandler, private final Map optionsToKeys; - private final List optionsEnabled; + private final Map 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(); - optionsEnabled = new ArrayList(); + optionsEnabled = new HashMap(); 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 index 0000000000..76258e574e --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/optiongroup/ReadOnlyOptionGroup.java @@ -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 index 0000000000..dfafe8fb40 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/optiongroup/ReadOnlyOptionGroupTest.java @@ -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"))); + } + +} -- cgit v1.2.3