]> source.dussan.org Git - vaadin-framework.git/commitdiff
Merged Test case and fix for #3609 - "Enabling/disabling components in a non-visible...
authorArtur Signell <artur.signell@itmill.com>
Tue, 17 Nov 2009 16:42:46 +0000 (16:42 +0000)
committerArtur Signell <artur.signell@itmill.com>
Tue, 17 Nov 2009 16:42:46 +0000 (16:42 +0000)
svn changeset:9851/svn branch:6.2

src/com/vaadin/ui/AbstractComponent.java
tests/src/com/vaadin/tests/components/abstractcomponent/EnableState.html [new file with mode: 0644]
tests/src/com/vaadin/tests/components/abstractcomponent/EnableState.java [new file with mode: 0644]

index 76fcd0ded345dda2c291953446809504ddf97b42..2e6a0d6e19c47cc576891bd19ae89a6f38397a08 100644 (file)
@@ -344,10 +344,25 @@ public abstract class AbstractComponent implements Component, MethodEventSource
      */
     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();
             }
         }
diff --git a/tests/src/com/vaadin/tests/components/abstractcomponent/EnableState.html b/tests/src/com/vaadin/tests/components/abstractcomponent/EnableState.html
new file mode 100644 (file)
index 0000000..f4bebcf
--- /dev/null
@@ -0,0 +1,87 @@
+<?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
diff --git a/tests/src/com/vaadin/tests/components/abstractcomponent/EnableState.java b/tests/src/com/vaadin/tests/components/abstractcomponent/EnableState.java
new file mode 100644 (file)
index 0000000..3c36af8
--- /dev/null
@@ -0,0 +1,77 @@
+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