*/
public void setTextFieldEnabled(boolean textFieldEnabled) {
this.textFieldEnabled = textFieldEnabled;
+ updateTextFieldEnabled();
+ }
+
+ protected void updateTextFieldEnabled() {
+ boolean reallyEnabled = isEnabled() && isTextFieldEnabled();
// IE has a non input disabled themeing that can not be overridden so we
// must fake the functionality using readonly and unselectable
if (BrowserInfo.get().isIE()) {
- if (!textFieldEnabled) {
+ if (!reallyEnabled) {
text.getElement().setAttribute("unselectable", "on");
text.getElement().setAttribute("readonly", "");
text.setTabIndex(-2);
- } else if (textFieldEnabled
+ } else if (reallyEnabled
&& text.getElement().hasAttribute("unselectable")) {
text.getElement().removeAttribute("unselectable");
text.getElement().removeAttribute("readonly");
text.setTabIndex(0);
}
} else {
- text.setEnabled(textFieldEnabled);
+ text.setEnabled(reallyEnabled);
}
- if (textFieldEnabled) {
+ if (reallyEnabled) {
calendarToggle.setTabIndex(-1);
Roles.getButtonRole().setAriaHiddenState(
calendarToggle.getElement(), true);
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
-
+ updateTextFieldEnabled();
calendarToggle.setEnabled(enabled);
Roles.getButtonRole().setAriaDisabledState(calendarToggle.getElement(),
!enabled);
if (!parsable) {
setText(previousValue);
}
-
- // superclass sets the text field independently when building date
- setTextFieldEnabled(isEnabled() && isTextFieldEnabled());
+ updateTextFieldEnabled();
}
/**
--- /dev/null
+package com.vaadin.tests.components.datefield;
+
+import java.util.Date;
+
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.CheckBox;
+import com.vaadin.ui.DateField;
+import com.vaadin.ui.PopupDateField;
+import com.vaadin.ui.VerticalLayout;
+
+public class DateFieldWhenChangingValueAndEnablingParent extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ final VerticalLayout main = new VerticalLayout();
+ final VerticalLayout sub = new VerticalLayout();
+ final CheckBox chk = new CheckBox("Parent layout enabled");
+
+ main.setMargin(true);
+ setContent(main);
+
+ final DateField df1 = createDateField(true);
+ final DateField df2 = createDateField(false);
+ final PopupDateField pdf1 = createPopupDateField(true, true);
+ final PopupDateField pdf2 = createPopupDateField(true, false);
+ final PopupDateField pdf3 = createPopupDateField(false, true);
+ final PopupDateField pdf4 = createPopupDateField(false, false);
+
+ sub.addComponent(df1);
+ sub.addComponent(df2);
+ sub.addComponent(pdf1);
+ sub.addComponent(pdf2);
+ sub.addComponent(pdf3);
+ sub.addComponent(pdf4);
+ sub.setEnabled(false);
+ main.addComponent(chk);
+ main.addComponent(sub);
+
+ chk.addValueChangeListener(new ValueChangeListener() {
+
+ @Override
+ public void valueChange(ValueChangeEvent event) {
+ df1.setValue(new Date());
+ df2.setValue(new Date());
+ pdf1.setValue(new Date());
+ pdf2.setValue(new Date());
+ pdf3.setValue(new Date());
+ pdf4.setValue(new Date());
+ sub.setEnabled(chk.getValue());
+ }
+ });
+ }
+
+ private DateField createDateField(boolean enabled) {
+ DateField df = new DateField("DateField, "
+ + (enabled ? "enabled" : "disabled"));
+ df.setEnabled(enabled);
+ df.setId("DATEFIELD_" + (enabled ? "ENABLED" : "DISABLED"));
+ return df;
+ }
+
+ private PopupDateField createPopupDateField(boolean enabled,
+ boolean textInputEnabled) {
+ PopupDateField df = new PopupDateField("PopupDateField, "
+ + (enabled ? "enabled" : "disabled") + ", text input "
+ + (textInputEnabled ? "enabled" : "disabled"));
+ df.setEnabled(enabled);
+ df.setTextFieldEnabled(textInputEnabled);
+ df.setId("DATEFIELD_" + (enabled ? "ENABLED" : "DISABLED") + "_"
+ + (textInputEnabled ? "ENABLED" : "DISABLED"));
+ return df;
+ }
+}
--- /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.datefield;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+
+import com.vaadin.testbench.elements.CheckBoxElement;
+import com.vaadin.testbench.elements.DateFieldElement;
+import com.vaadin.testbench.elements.PopupDateFieldElement;
+import com.vaadin.tests.tb3.SingleBrowserTest;
+
+public class DateFieldWhenChangingValueAndEnablingParentTest extends
+ SingleBrowserTest {
+
+ @Test
+ public void ensureCorrectStateAfterEnabling() {
+ openTestURL();
+ $(CheckBoxElement.class).first().click();
+
+ assertState($(DateFieldElement.class).id("DATEFIELD_ENABLED"), true,
+ true);
+ assertState($(DateFieldElement.class).id("DATEFIELD_DISABLED"), false,
+ false);
+
+ assertState(
+ $(PopupDateFieldElement.class).id("DATEFIELD_ENABLED_ENABLED"),
+ true, true);
+ assertState(
+ $(PopupDateFieldElement.class).id("DATEFIELD_ENABLED_DISABLED"),
+ true, false);
+
+ // disabling widget should always disable input
+ assertState(
+ $(PopupDateFieldElement.class).id("DATEFIELD_DISABLED_ENABLED"),
+ false, false);
+ assertState(
+ $(PopupDateFieldElement.class)
+ .id("DATEFIELD_DISABLED_DISABLED"), false, false);
+
+ }
+
+ /**
+ * @since
+ * @param id
+ * @param widgetEnabled
+ * @param textInputEnabled
+ */
+ private void assertState(DateFieldElement id, boolean widgetEnabled,
+ boolean textInputEnabled) {
+ assertDateFieldEnabled(id, widgetEnabled);
+ assertTextInputEnabled(id, textInputEnabled);
+
+ }
+
+ private void assertDateFieldEnabled(DateFieldElement id,
+ boolean assertEnabled) {
+ boolean hasClass = hasCssClass(id, "v-disabled");
+ boolean fieldEnabled = !hasClass;
+ if (assertEnabled) {
+ Assert.assertTrue("Field " + id.getAttribute("id")
+ + " should be enabled", fieldEnabled);
+ } else {
+ Assert.assertFalse("Field " + id.getAttribute("id")
+ + " should be disabled", fieldEnabled);
+ }
+
+ }
+
+ private void assertTextInputEnabled(DateFieldElement id, boolean enabled) {
+ String disabledAttr = id.findElement(By.xpath("./input")).getAttribute(
+ "disabled");
+ boolean textinputEnabled = (disabledAttr == null);
+
+ if (enabled) {
+ Assert.assertTrue("Field " + id.getAttribute("id")
+ + " text field should be enabled", textinputEnabled);
+ } else {
+ Assert.assertFalse("Field " + id.getAttribute("id")
+ + " text field should be disabled", textinputEnabled);
+ }
+
+ }
+}