aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenri Sara <henri.sara@itmill.com>2010-05-27 09:16:39 +0000
committerHenri Sara <henri.sara@itmill.com>2010-05-27 09:16:39 +0000
commit8c60fc5fb4a2f2f26a7a2842a79ba57f9976c1ee (patch)
treee601e8f969236e03cc566155955ba36d614cd7ed
parent12e5f5e5aa852632b5f0c0783f3d1591354669c8 (diff)
downloadvaadin-framework-8c60fc5fb4a2f2f26a7a2842a79ba57f9976c1ee.tar.gz
vaadin-framework-8c60fc5fb4a2f2f26a7a2842a79ba57f9976c1ee.zip
#5013 AbstractField did not repaint property read-only status changes immediately
svn changeset:13390/svn branch:6.3
-rw-r--r--src/com/vaadin/ui/AbstractField.java21
-rw-r--r--tests/src/com/vaadin/tests/components/abstractfield/AbstractFieldDataSourceReadOnly.html42
-rw-r--r--tests/src/com/vaadin/tests/components/abstractfield/AbstractFieldDataSourceReadOnly.java58
3 files changed, 121 insertions, 0 deletions
diff --git a/src/com/vaadin/ui/AbstractField.java b/src/com/vaadin/ui/AbstractField.java
index 17e82e86e4..f7d1ddd79e 100644
--- a/src/com/vaadin/ui/AbstractField.java
+++ b/src/com/vaadin/ui/AbstractField.java
@@ -55,6 +55,7 @@ import com.vaadin.terminal.PaintTarget;
*/
@SuppressWarnings("serial")
public abstract class AbstractField extends AbstractComponent implements Field,
+ Property.ReadOnlyStatusChangeListener,
Property.ReadOnlyStatusChangeNotifier, Action.ShortcutNotifier {
/* Private members */
@@ -571,6 +572,12 @@ public abstract class AbstractField extends AbstractComponent implements Field,
.isAssignableFrom(dataSource.getClass())) {
((Property.ValueChangeNotifier) dataSource).removeListener(this);
}
+ if (dataSource != null
+ && Property.ReadOnlyStatusChangeNotifier.class
+ .isAssignableFrom(dataSource.getClass())) {
+ ((Property.ReadOnlyStatusChangeNotifier) dataSource)
+ .removeListener(this);
+ }
// Sets the new data source
dataSource = newDataSource;
@@ -592,6 +599,10 @@ public abstract class AbstractField extends AbstractComponent implements Field,
if (dataSource instanceof Property.ValueChangeNotifier) {
((Property.ValueChangeNotifier) dataSource).addListener(this);
}
+ if (dataSource instanceof Property.ReadOnlyStatusChangeNotifier) {
+ ((Property.ReadOnlyStatusChangeNotifier) dataSource)
+ .addListener(this);
+ }
// Copy the validators from the data source
if (dataSource instanceof Validatable) {
@@ -893,6 +904,16 @@ public abstract class AbstractField extends AbstractComponent implements Field,
}
/**
+ * React to read only status changes of the property by requesting a
+ * repaint.
+ *
+ * @see Property.ReadOnlyStatusChangeListener
+ */
+ public void readOnlyStatusChange(Property.ReadOnlyStatusChangeEvent event) {
+ requestRepaint();
+ }
+
+ /**
* An <code>Event</code> object specifying the Property whose read-only
* status has changed.
*
diff --git a/tests/src/com/vaadin/tests/components/abstractfield/AbstractFieldDataSourceReadOnly.html b/tests/src/com/vaadin/tests/components/abstractfield/AbstractFieldDataSourceReadOnly.html
new file mode 100644
index 0000000000..1e78108e42
--- /dev/null
+++ b/tests/src/com/vaadin/tests/components/abstractfield/AbstractFieldDataSourceReadOnly.html
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<link rel="selenium.base" href="http://localhost:8888/run/AbstractFieldDataSourceReadOnly" />
+<title>AbstractFieldDataSourceReadOnly</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+<thead>
+<tr><td rowspan="1" colspan="3">AbstractFieldDataSourceReadOnly</td></tr>
+</thead><tbody>
+<tr>
+ <td>open</td>
+ <td>/run/AbstractFieldDataSourceReadOnly</td>
+ <td></td>
+</tr>
+<tr>
+ <td>waitForVaadin</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>click</td>
+ <td>vaadin=runAbstractFieldDataSourceReadOnly::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]</td>
+ <td></td>
+</tr>
+<tr>
+ <td>waitForVaadin</td>
+ <td></td>
+ <td></td>
+</tr>
+<tr>
+ <td>screenCapture</td>
+ <td></td>
+ <td></td>
+</tr>
+
+</tbody></table>
+</body>
+</html>
diff --git a/tests/src/com/vaadin/tests/components/abstractfield/AbstractFieldDataSourceReadOnly.java b/tests/src/com/vaadin/tests/components/abstractfield/AbstractFieldDataSourceReadOnly.java
new file mode 100644
index 0000000000..d439544067
--- /dev/null
+++ b/tests/src/com/vaadin/tests/components/abstractfield/AbstractFieldDataSourceReadOnly.java
@@ -0,0 +1,58 @@
+package com.vaadin.tests.components.abstractfield;
+
+import com.vaadin.data.util.ObjectProperty;
+import com.vaadin.tests.components.TestBase;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.TextField;
+import com.vaadin.ui.Component.Event;
+import com.vaadin.ui.Component.Listener;
+
+public class AbstractFieldDataSourceReadOnly extends TestBase {
+
+ private static class StateHolder {
+ private ObjectProperty textField = new ObjectProperty("");
+
+ public ObjectProperty getTextField() {
+ return textField;
+ }
+
+ public void setTextField(ObjectProperty textField) {
+ this.textField = textField;
+ }
+
+ public void buttonClicked() {
+ textField.setReadOnly(true);
+ }
+ }
+
+ @Override
+ protected void setup() {
+ final StateHolder stateHolder = new StateHolder();
+
+ // Button
+ Button button = new Button("Make data source read-only");
+ button.addListener(new Listener() {
+ public void componentEvent(Event event) {
+ stateHolder.buttonClicked();
+ }
+ });
+
+ // Input field
+ TextField input = new TextField("Field");
+ input.setPropertyDataSource(stateHolder.getTextField());
+
+ addComponent(button);
+ addComponent(input);
+ }
+
+ @Override
+ protected String getDescription() {
+ return "Read-only status changes in data sources are not rendered immediately";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 5013;
+ }
+
+}