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;
super(CLASSNAME);
panel = (Panel) optionsContainer;
optionsToKeys = new HashMap<CheckBox, String>();
- optionsEnabled = new ArrayList<Boolean>();
+ optionsEnabled = new HashMap<CheckBox, Boolean>();
wasMultiselect = isMultiselect();
}
.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,
@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++;
}
}
--- /dev/null
+/*
+ * 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;
+ }
+
+}
--- /dev/null
+/*
+ * 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")));
+ }
+
+}