From 1f4c5f8ee28ba7ce6b5a3c490ff5cf70849f1807 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Tue, 18 Dec 2012 11:22:28 +0200 Subject: Do not update data model when locale changes (#10562, #8192) Change-Id: I84e00c9e73d69bb398a8e9cc2c6bdb7fa60d3907 --- server/src/com/vaadin/ui/AbstractField.java | 8 ++++++-- .../AbstractFieldValueConversions.java | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/server/src/com/vaadin/ui/AbstractField.java b/server/src/com/vaadin/ui/AbstractField.java index 9cf72a36b3..4b1476db32 100644 --- a/server/src/com/vaadin/ui/AbstractField.java +++ b/server/src/com/vaadin/ui/AbstractField.java @@ -1348,8 +1348,12 @@ public abstract class AbstractField extends AbstractComponent implements && !isBuffered() && !isModified()) { // When we have a data source and the internal value is directly // read from that we want to update the value - Object modelValue = convertToModel(getInternalValue(), valueLocale); - setValue(convertFromModel(modelValue)); + T newInternalValue = convertFromModel(getPropertyDataSource() + .getValue()); + if (!equals(newInternalValue, getInternalValue())) { + setInternalValue(newInternalValue); + fireValueChange(false); + } } } diff --git a/server/tests/src/com/vaadin/tests/server/component/abstractfield/AbstractFieldValueConversions.java b/server/tests/src/com/vaadin/tests/server/component/abstractfield/AbstractFieldValueConversions.java index 16c7c4060d..2f1b1f9dbc 100644 --- a/server/tests/src/com/vaadin/tests/server/component/abstractfield/AbstractFieldValueConversions.java +++ b/server/tests/src/com/vaadin/tests/server/component/abstractfield/AbstractFieldValueConversions.java @@ -26,6 +26,12 @@ public class AbstractFieldValueConversions extends TestCase { 34, Sex.FEMALE, new Address("Paula street 1", 12345, "P-town", Country.FINLAND)); + /** + * Java uses a non-breaking space (ascii 160) instead of space when + * formatting + */ + private static final char FORMATTED_SPACE = 160; + public void testWithoutConversion() { TextField tf = new TextField(); tf.setPropertyDataSource(new MethodProperty(paulaBean, @@ -87,6 +93,22 @@ public class AbstractFieldValueConversions extends TestCase { assertEquals("42", tf.getValue()); } + public void testChangeReadOnlyFieldLocale() { + VaadinSession.setCurrent(new VaadinSession(null)); + + TextField tf = new TextField("salary"); + tf.setLocale(new Locale("en", "US")); + ObjectProperty ds = new ObjectProperty(123456789); + ds.setReadOnly(true); + tf.setPropertyDataSource(ds); + assertEquals((Integer) 123456789, ds.getValue()); + assertEquals("123,456,789", tf.getValue()); + tf.setLocale(new Locale("fi", "FI")); + assertEquals((Integer) 123456789, ds.getValue()); + assertEquals("123" + FORMATTED_SPACE + "456" + FORMATTED_SPACE + "789", + tf.getValue()); + } + public void testBooleanNullConversion() { CheckBox cb = new CheckBox(); cb.setConverter(new Converter() { -- cgit v1.2.3