From: Maciej PrzepioĢra Date: Mon, 24 Feb 2014 01:56:59 +0000 (+0200) Subject: Fire value change events from Label when content changes (#12414) X-Git-Tag: 7.2.0.beta1~124 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=856725693ba36a08d2dc5cccf94333ac030dba2c;p=vaadin-framework.git Fire value change events from Label when content changes (#12414) Change-Id: I9656025ebde0a80c913713856f5c0374e0f92c27 --- diff --git a/server/src/com/vaadin/ui/Label.java b/server/src/com/vaadin/ui/Label.java index 3aa83de420..71d54fc29a 100644 --- a/server/src/com/vaadin/ui/Label.java +++ b/server/src/com/vaadin/ui/Label.java @@ -186,7 +186,8 @@ public class Label extends AbstractComponent implements Property, /** * Set the value of the label. Value of the label is the XML contents of the - * label. + * label. Since Vaadin 7.2, changing the value of Label instance with that + * method will fire ValueChangeEvent. * * @param newStringValue * the New value of the label. @@ -194,7 +195,13 @@ public class Label extends AbstractComponent implements Property, @Override public void setValue(String newStringValue) { if (getPropertyDataSource() == null) { - getState().text = newStringValue; + + LabelState state = (LabelState) getState(false); + String oldTextValue = state.text; + if (!SharedUtil.equals(oldTextValue, newStringValue)) { + getState().text = newStringValue; + fireValueChange(); + } } else { throw new IllegalStateException( "Label is only a Property.Viewer and cannot update its data source"); @@ -223,7 +230,8 @@ public class Label extends AbstractComponent implements Property, } /** - * Sets the property as data-source for viewing. + * Sets the property as data-source for viewing. Since Vaadin 7.2 a + * ValueChangeEvent is fired if the new value is different from previous. * * @param newDataSource * the new data source Property @@ -253,7 +261,7 @@ public class Label extends AbstractComponent implements Property, if (dataSource != null) { // Update the value from the data source. If data source was set to // null, retain the old value - getState().text = getDataSourceValue(); + updateValueFromDataSource(); } // Listens the new data source if possible @@ -404,7 +412,8 @@ public class Label extends AbstractComponent implements Property, private void updateValueFromDataSource() { // Update the internal value from the data source String newConvertedValue = getDataSourceValue(); - if (!SharedUtil.equals(newConvertedValue, getState().text)) { + if (!SharedUtil.equals(newConvertedValue, + ((LabelState) getState(false)).text)) { getState().text = newConvertedValue; fireValueChange(); } diff --git a/server/tests/src/com/vaadin/tests/server/component/label/LabelListeners.java b/server/tests/src/com/vaadin/tests/server/component/label/LabelListeners.java index 3ed79f5010..9bb4c53ba2 100644 --- a/server/tests/src/com/vaadin/tests/server/component/label/LabelListeners.java +++ b/server/tests/src/com/vaadin/tests/server/component/label/LabelListeners.java @@ -1,5 +1,14 @@ package com.vaadin.tests.server.component.label; +import static org.easymock.EasyMock.anyObject; +import static org.easymock.EasyMock.createStrictMock; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.verify; + +import org.easymock.EasyMock; + +import com.vaadin.data.Property; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.tests.server.component.AbstractListenerMethodsTest; import com.vaadin.ui.Label; @@ -10,4 +19,74 @@ public class LabelListeners extends AbstractListenerMethodsTest { testListenerAddGetRemove(Label.class, ValueChangeEvent.class, ValueChangeListener.class); } + + public void testValueChangeFiredWhenSettingValue() { + Label underTest = new Label(); + + // setup the mock listener + ValueChangeListener mockListener = createStrictMock(ValueChangeListener.class); + // record + mockListener + .valueChange(anyObject(com.vaadin.data.Property.ValueChangeEvent.class)); + + // test + underTest.addValueChangeListener(mockListener); + + replay(mockListener); + underTest.setValue("A new value"); + + verify(mockListener); + + } + + public void testValueChangeFiredWhenSettingPropertyDataSource() { + // setup + Label underTest = new Label(); + + Property mockProperty = EasyMock.createMock(Property.class); + + ValueChangeListener mockListener = createStrictMock(ValueChangeListener.class); + // record + mockListener + .valueChange(anyObject(com.vaadin.data.Property.ValueChangeEvent.class)); + + expect(mockProperty.getType()).andReturn(String.class).atLeastOnce(); + expect(mockProperty.getValue()).andReturn("Any").atLeastOnce(); + + // test + + replay(mockListener, mockProperty); + underTest.addValueChangeListener(mockListener); + underTest.setPropertyDataSource(mockProperty); + + verify(mockListener); + + } + + public void testValueChangeNotFiredWhenNotSettingValue() { + Label underTest = new Label(); + // setup the mock listener + ValueChangeListener mockListener = createStrictMock(ValueChangeListener.class); + // record: nothing to record + + // test + underTest.addValueChangeListener(mockListener); + replay(mockListener); + verify(mockListener); + } + + public void testNoValueChangeFiredWhenSettingPropertyDataSourceToNull() { + Label underTest = new Label(); + // setup the mock Listener + ValueChangeListener mockListener = createStrictMock(ValueChangeListener.class); + // record: nothing to record + + // test + underTest.addValueChangeListener(mockListener); + underTest.setPropertyDataSource(null); + + replay(mockListener); + verify(mockListener); + } + }