Change-Id: I3e38bb5c03453b6c1ad5c9bb717241297a779f73tags/7.5.0.beta1
@@ -269,24 +269,29 @@ public class VPopupCalendar extends VTextualDate implements Field, | |||
*/ | |||
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); | |||
@@ -466,7 +471,7 @@ public class VPopupCalendar extends VTextualDate implements Field, | |||
@Override | |||
public void setEnabled(boolean enabled) { | |||
super.setEnabled(enabled); | |||
updateTextFieldEnabled(); | |||
calendarToggle.setEnabled(enabled); | |||
Roles.getButtonRole().setAriaDisabledState(calendarToggle.getElement(), | |||
!enabled); | |||
@@ -500,9 +505,7 @@ public class VPopupCalendar extends VTextualDate implements Field, | |||
if (!parsable) { | |||
setText(previousValue); | |||
} | |||
// superclass sets the text field independently when building date | |||
setTextFieldEnabled(isEnabled() && isTextFieldEnabled()); | |||
updateTextFieldEnabled(); | |||
} | |||
/** |
@@ -0,0 +1,76 @@ | |||
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; | |||
} | |||
} |
@@ -0,0 +1,98 @@ | |||
/* | |||
* 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); | |||
} | |||
} | |||
} |