*/
public void setEnabled(boolean enabled) {
if (this.enabled != enabled) {
- boolean wasEnabled = isEnabled();
+ boolean wasEnabled = this.enabled;
+ boolean wasEnabledInContext = isEnabled();
+
this.enabled = enabled;
- // don't repaint if ancestor is disabled
- if (wasEnabled != isEnabled()) {
+
+ boolean isEnabled = enabled;
+ boolean isEnabledInContext = isEnabled();
+
+ // If the actual enabled state (as rendered, in context) has not
+ // changed we do not need to repaint except if the parent is
+ // invisible.
+ // If the parent is invisible we must request a repaint so the
+ // component is repainted with the new enabled state when the parent
+ // is set visible again. This workaround is needed as isEnabled
+ // checks isVisible.
+ boolean needRepaint = (wasEnabledInContext != isEnabledInContext)
+ || (wasEnabled != isEnabled && !parent.isVisible());
+
+ if (needRepaint) {
requestRepaint();
}
}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\r
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">\r
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
+<link rel="selenium.base" href="" />\r
+<title>New Test</title>\r
+</head>\r
+<body>\r
+<table cellpadding="1" cellspacing="1" border="1">\r
+<thead>\r
+<tr><td rowspan="1" colspan="3">New Test</td></tr>\r
+</thead><tbody>\r
+<tr>\r
+ <td>open</td>\r
+ <td>/run/com.vaadin.tests.components.abstractcomponent.EnableState</td>\r
+ <td></td>\r
+</tr>\r
+<tr>\r
+ <td>waitForVaadin</td>\r
+ <td></td>\r
+ <td></td>\r
+</tr>\r
+<tr>\r
+ <td>mouseClick</td>\r
+ <td>vaadin=runcomvaadintestscomponentsabstractcomponentEnableState::/VVerticalLayout[0]/ChildComponentContainer[3]/VCheckBox[0]/domChild[0]</td>\r
+ <td>58,5</td>\r
+</tr>\r
+<tr>\r
+ <td>waitForVaadin</td>\r
+ <td></td>\r
+ <td></td>\r
+</tr>\r
+<tr>\r
+ <td>screenCapture</td>\r
+ <td></td>\r
+ <td>disable-cascade</td>\r
+</tr>\r
+<tr>\r
+ <td>mouseClick</td>\r
+ <td>vaadin=runcomvaadintestscomponentsabstractcomponentEnableState::/VVerticalLayout[0]/ChildComponentContainer[3]/VCheckBox[0]/domChild[0]</td>\r
+ <td>49,7</td>\r
+</tr>\r
+<tr>\r
+ <td>waitForVaadin</td>\r
+ <td></td>\r
+ <td></td>\r
+</tr>\r
+<tr>\r
+ <td>mouseClick</td>\r
+ <td>vaadin=runcomvaadintestscomponentsabstractcomponentEnableState::/VVerticalLayout[0]/ChildComponentContainer[2]/VCheckBox[0]/domChild[0]</td>\r
+ <td>55,7</td>\r
+</tr>\r
+<tr>\r
+ <td>waitForVaadin</td>\r
+ <td></td>\r
+ <td></td>\r
+</tr>\r
+<tr>\r
+ <td>mouseClick</td>\r
+ <td>vaadin=runcomvaadintestscomponentsabstractcomponentEnableState::/VVerticalLayout[0]/ChildComponentContainer[0]/VCheckBox[0]/domChild[0]</td>\r
+ <td>76,8</td>\r
+</tr>\r
+<tr>\r
+ <td>waitForVaadin</td>\r
+ <td></td>\r
+ <td></td>\r
+</tr>\r
+<tr>\r
+ <td>mouseClick</td>\r
+ <td>vaadin=runcomvaadintestscomponentsabstractcomponentEnableState::/VVerticalLayout[0]/ChildComponentContainer[2]/VCheckBox[0]/domChild[0]</td>\r
+ <td>58,8</td>\r
+</tr>\r
+<tr>\r
+ <td>waitForVaadin</td>\r
+ <td></td>\r
+ <td></td>\r
+</tr>\r
+<tr>\r
+ <td>screenCapture</td>\r
+ <td></td>\r
+ <td>button-disabled</td>\r
+</tr>\r
+\r
+</tbody></table>\r
+</body>\r
+</html>\r
--- /dev/null
+package com.vaadin.tests.components.abstractcomponent;\r
+\r
+import com.vaadin.tests.components.AbstractTestCase;\r
+import com.vaadin.ui.Button;\r
+import com.vaadin.ui.CheckBox;\r
+import com.vaadin.ui.Panel;\r
+import com.vaadin.ui.Window;\r
+import com.vaadin.ui.Button.ClickEvent;\r
+\r
+public class EnableState extends AbstractTestCase {\r
+ @Override\r
+ public void init() {\r
+ Window mainWindow = new Window("Helloworld Application");\r
+\r
+ final Panel panel = new Panel("Test");\r
+ final Button button = new Button("ablebutton");\r
+ panel.addComponent(button);\r
+\r
+ CheckBox enable = new CheckBox("Toggle button enabled", true);\r
+ enable.addListener(new Button.ClickListener() {\r
+ public void buttonClick(ClickEvent event) {\r
+ boolean enabled = (Boolean) event.getButton().getValue();\r
+ button.setEnabled(enabled);\r
+ // button.requestRepaint();\r
+ }\r
+ });\r
+ enable.setImmediate(true);\r
+\r
+ CheckBox caption = new CheckBox("Toggle button caption", true);\r
+ caption.addListener(new Button.ClickListener() {\r
+ public void buttonClick(ClickEvent event) {\r
+ button.setCaption(button.getCaption() + "+");\r
+ }\r
+ });\r
+ caption.setImmediate(true);\r
+\r
+ CheckBox visible = new CheckBox("Toggle panel visibility", true);\r
+ visible.addListener(new Button.ClickListener() {\r
+ public void buttonClick(ClickEvent event) {\r
+ boolean visible = (Boolean) event.getButton().getValue();\r
+\r
+ panel.setVisible(visible);\r
+ }\r
+ });\r
+ visible.setImmediate(true);\r
+\r
+ CheckBox panelEnable = new CheckBox("Toggle panel enabled", true);\r
+ panelEnable.addListener(new Button.ClickListener() {\r
+ public void buttonClick(ClickEvent event) {\r
+ boolean enabled = (Boolean) event.getButton().getValue();\r
+ panel.setEnabled(enabled);\r
+ }\r
+ });\r
+ panelEnable.setImmediate(true);\r
+\r
+ mainWindow.addComponent(enable);\r
+ mainWindow.addComponent(caption);\r
+ mainWindow.addComponent(visible);\r
+ mainWindow.addComponent(panelEnable);\r
+ mainWindow.addComponent(panel);\r
+\r
+ setMainWindow(mainWindow);\r
+ }\r
+\r
+ @Override\r
+ protected String getDescription() {\r
+ return "This tests the enabled/disabled propagation and that enabled/disabled state is updated"\r
+ + " properly even when the parent is invisible. Disabling the Button while the panel is"\r
+ + " invisible should be reflected on the screen when the panel is set visible"\r
+ + " again.";\r
+ }\r
+\r
+ @Override\r
+ protected Integer getTicketNumber() {\r
+ return 3609;\r
+ }\r
+}\r