bug 182059 - Aggregation of fixes for bug 195603, 196557, and 197408.
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/ButtonObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/ButtonObservableValue.java
index 7acfbd8..b4112ff 100644
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/ButtonObservableValue.java
+++ b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/ButtonObservableValue.java
@@ -33,8 +33,8 @@
public void handleEvent(Event event) {
boolean oldSelectionValue = selectionValue;
selectionValue = button.getSelection();
- fireValueChange(Diffs.createValueDiff(oldSelectionValue ? Boolean.TRUE : Boolean.FALSE,
- selectionValue ? Boolean.TRUE : Boolean.FALSE));
+
+ notifyIfChanged(oldSelectionValue, selectionValue);
}
};
@@ -66,9 +66,9 @@
boolean oldSelectionValue = selectionValue;
selectionValue = value == null ? false : ((Boolean) value)
.booleanValue();
+
button.setSelection(selectionValue);
- fireValueChange(Diffs.createValueDiff(oldSelectionValue ? Boolean.TRUE : Boolean.FALSE,
- selectionValue ? Boolean.TRUE : Boolean.FALSE));
+ notifyIfChanged(oldSelectionValue, selectionValue);
}
public Object doGetValue() {
@@ -76,7 +76,19 @@
}
public Object getValueType() {
- return Boolean.class;
+ return Boolean.TYPE;
}
+ /**
+ * Notifies consumers with a value change event only if a change occurred.
+ *
+ * @param oldValue
+ * @param newValue
+ */
+ private void notifyIfChanged(boolean oldValue, boolean newValue) {
+ if (oldValue != newValue) {
+ fireValueChange(Diffs.createValueDiff(oldValue ? Boolean.TRUE : Boolean.FALSE,
+ newValue ? Boolean.TRUE : Boolean.FALSE));
+ }
+ }
}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/CComboObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/CComboObservableValue.java
index 4d57d7d..7e58236 100644
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/CComboObservableValue.java
+++ b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/CComboObservableValue.java
@@ -71,8 +71,8 @@
String oldValue = currentValue;
currentValue = CComboObservableValue.this.ccombo
.getText();
- fireValueChange(Diffs.createValueDiff(oldValue,
- currentValue));
+
+ notifyIfChanged(oldValue, currentValue);
}
}
});
@@ -107,7 +107,8 @@
} finally {
updating = false;
}
- fireValueChange(Diffs.createValueDiff(oldValue, ccombo.getText()));
+
+ notifyIfChanged(oldValue, ccombo.getText());
}
public Object doGetValue() {
@@ -134,4 +135,10 @@
public String getAttribute() {
return attribute;
}
+
+ private void notifyIfChanged(String oldValue, String newValue) {
+ if (!oldValue.equals(newValue)) {
+ fireValueChange(Diffs.createValueDiff(oldValue, ccombo.getText()));
+ }
+ }
}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/CComboSingleSelectionObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/CComboSingleSelectionObservableValue.java
index 8d79dd2..3f15855 100644
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/CComboSingleSelectionObservableValue.java
+++ b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/CComboSingleSelectionObservableValue.java
@@ -11,6 +11,7 @@
*******************************************************************************/
package org.eclipse.jface.internal.databinding.internal.swt;
+import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
@@ -27,6 +28,14 @@
public CComboSingleSelectionObservableValue(CCombo combo) {
super(combo);
}
+
+ /**
+ * @param realm
+ * @param combo
+ */
+ public CComboSingleSelectionObservableValue(Realm realm, CCombo combo) {
+ super(realm, combo);
+ }
private CCombo getCCombo() {
return (CCombo) getWidget();
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/CLabelObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/CLabelObservableValue.java
index bbdc16c..a18d076 100644
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/CLabelObservableValue.java
+++ b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/CLabelObservableValue.java
@@ -43,8 +43,12 @@
public void doSetValue(final Object value) {
String oldValue = label.getText();
- label.setText(value == null ? "" : value.toString()); //$NON-NLS-1$
- fireValueChange(Diffs.createValueDiff(oldValue, label.getText()));
+ String newValue = value == null ? "" : value.toString(); //$NON-NLS-1$
+ label.setText(newValue);
+
+ if (!newValue.equals(oldValue)) {
+ fireValueChange(Diffs.createValueDiff(oldValue, newValue));
+ }
}
public Object doGetValue() {
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/ComboObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/ComboObservableValue.java
index d7c391b..9b20319 100644
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/ComboObservableValue.java
+++ b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/ComboObservableValue.java
@@ -64,8 +64,8 @@
String oldValue = currentValue;
currentValue = ComboObservableValue.this.combo
.getText();
- fireValueChange(Diffs.createValueDiff(oldValue,
- currentValue));
+
+ notifyIfChanged(oldValue, currentValue);
}
}
});
@@ -100,7 +100,8 @@
} finally {
updating = false;
}
- fireValueChange(Diffs.createValueDiff(oldValue, combo.getText()));
+
+ notifyIfChanged(oldValue, combo.getText());
}
public Object doGetValue() {
@@ -127,4 +128,10 @@
public String getAttribute() {
return attribute;
}
+
+ private void notifyIfChanged(String oldValue, String newValue) {
+ if (!oldValue.equals(newValue)) {
+ fireValueChange(Diffs.createValueDiff(oldValue, newValue));
+ }
+ }
}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/LabelObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/LabelObservableValue.java
index fe94587..2bd9012 100644
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/LabelObservableValue.java
+++ b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/LabelObservableValue.java
@@ -43,8 +43,12 @@
public void doSetValue(final Object value) {
String oldValue = label.getText();
- label.setText(value == null ? "" : value.toString()); //$NON-NLS-1$
- fireValueChange(Diffs.createValueDiff(oldValue, label.getText()));
+ String newValue = value == null ? "" : value.toString(); //$NON-NLS-1$
+ label.setText(newValue);
+
+ if (!newValue.equals(oldValue)) {
+ fireValueChange(Diffs.createValueDiff(oldValue, newValue));
+ }
}
public Object doGetValue() {
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/ScaleObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/ScaleObservableValue.java
index e8460e6..5683e4c 100644
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/ScaleObservableValue.java
+++ b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/ScaleObservableValue.java
@@ -67,8 +67,7 @@
if (!updating) {
int newSelection = ScaleObservableValue.this.scale
.getSelection();
- fireValueChange(Diffs.createValueDiff(new Integer(
- currentSelection), new Integer(newSelection)));
+ notifyIfChanged(currentSelection, newSelection);
currentSelection = newSelection;
}
}
@@ -100,8 +99,8 @@
Assert.isTrue(false, "invalid attribute name:" + attribute); //$NON-NLS-1$
return;
}
- fireValueChange(Diffs.createValueDiff(new Integer(oldValue),
- new Integer(newValue)));
+
+ notifyIfChanged(oldValue, newValue);
} finally {
updating = false;
}
@@ -141,4 +140,11 @@
}
listener = null;
}
+
+ private void notifyIfChanged(int oldValue, int newValue) {
+ if (oldValue != newValue) {
+ fireValueChange(Diffs.createValueDiff(new Integer(oldValue),
+ new Integer(newValue)));
+ }
+ }
}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/SingleSelectionObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/SingleSelectionObservableValue.java
index b9026ce..9daa486 100644
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/SingleSelectionObservableValue.java
+++ b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/SingleSelectionObservableValue.java
@@ -51,8 +51,7 @@
public void run() {
if (!updating) {
int newSelection = doGetSelectionIndex();
- fireValueChange(Diffs.createValueDiff(new Integer(
- currentSelection), new Integer(newSelection)));
+ notifyIfChanged(currentSelection, newSelection);
currentSelection = newSelection;
}
}
@@ -69,6 +68,7 @@
updating = true;
int intValue = ((Integer) value).intValue();
doSetSelectionIndex(intValue);
+ notifyIfChanged(currentSelection, intValue);
currentSelection = intValue;
} finally {
updating = false;
@@ -94,4 +94,10 @@
return Integer.TYPE;
}
+ private void notifyIfChanged(int oldValue, int newValue) {
+ if (oldValue != newValue) {
+ fireValueChange(Diffs.createValueDiff(new Integer(
+ oldValue), new Integer(newValue)));
+ }
+ }
}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/SpinnerObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/SpinnerObservableValue.java
index b9e84f7..cd48d68 100644
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/SpinnerObservableValue.java
+++ b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/SpinnerObservableValue.java
@@ -64,8 +64,7 @@
if (!updating) {
int newSelection = SpinnerObservableValue.this.spinner
.getSelection();
- fireValueChange(Diffs.createValueDiff(new Integer(
- currentSelection), new Integer(newSelection)));
+ notifyIfChanged(currentSelection, newSelection);
currentSelection = newSelection;
}
}
@@ -97,8 +96,7 @@
Assert.isTrue(false, "invalid attribute name:" + attribute); //$NON-NLS-1$
return;
}
- fireValueChange(Diffs.createValueDiff(new Integer(oldValue),
- new Integer(newValue)));
+ notifyIfChanged(oldValue, newValue);
} finally {
updating = false;
}
@@ -126,4 +124,11 @@
public String getAttribute() {
return attribute;
}
+
+ private void notifyIfChanged(int oldValue, int newValue) {
+ if (oldValue != newValue) {
+ fireValueChange(Diffs.createValueDiff(new Integer(oldValue),
+ new Integer(newValue)));
+ }
+ }
}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/TextEditableObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/TextEditableObservableValue.java
index f8b21c6..703372f 100644
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/TextEditableObservableValue.java
+++ b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/TextEditableObservableValue.java
@@ -11,6 +11,7 @@
package org.eclipse.jface.internal.databinding.internal.swt;
+import org.eclipse.core.databinding.observable.Diffs;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
import org.eclipse.swt.widgets.Text;
@@ -58,10 +59,17 @@
* @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#doSetValue(java.lang.Object)
*/
protected void doSetValue(Object value) {
- if (Boolean.TRUE.equals(value)) {
- text.setEditable(true);
- } else if (Boolean.FALSE.equals(value)) {
- text.setEditable(false);
+ if (value == null) {
+ throw new IllegalArgumentException("Parameter value was null."); //$NON-NLS-1$
+ }
+
+ Boolean oldValue = new Boolean(text.getEditable());
+ Boolean newValue = (Boolean) value;
+
+ text.setEditable(newValue.booleanValue());
+
+ if (!oldValue.equals(newValue)) {
+ fireValueChange(Diffs.createValueDiff(oldValue, newValue));
}
}
}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/BindingTestSuite.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/BindingTestSuite.java
index 76138d3..94026e9 100644
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/BindingTestSuite.java
+++ b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/BindingTestSuite.java
@@ -109,6 +109,7 @@
import org.eclipse.jface.tests.internal.databinding.internal.swt.ButtonObservableValueTest;
import org.eclipse.jface.tests.internal.databinding.internal.swt.CComboObservableValueSelectionTest;
import org.eclipse.jface.tests.internal.databinding.internal.swt.CComboObservableValueTextTest;
+import org.eclipse.jface.tests.internal.databinding.internal.swt.CComboSingleSelectionObservableValueTest;
import org.eclipse.jface.tests.internal.databinding.internal.swt.CLabelObservableValueTest;
import org.eclipse.jface.tests.internal.databinding.internal.swt.ComboObservableValueSelectionTest;
import org.eclipse.jface.tests.internal.databinding.internal.swt.ComboObservableValueTextTest;
@@ -268,6 +269,7 @@
addTest(ButtonObservableValueTest.suite());
addTest(CComboObservableValueSelectionTest.suite());
addTest(CComboObservableValueTextTest.suite());
+ addTest(CComboSingleSelectionObservableValueTest.suite());
addTest(CLabelObservableValueTest.suite());
addTest(ComboObservableValueSelectionTest.suite());
addTest(ComboObservableValueTextTest.suite());
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/internal/swt/ButtonObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/internal/swt/ButtonObservableValueTest.java
index 4a92b3f..6aab90d 100644
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/internal/swt/ButtonObservableValueTest.java
+++ b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/internal/swt/ButtonObservableValueTest.java
@@ -31,13 +31,34 @@
* @since 3.2
*/
public class ButtonObservableValueTest extends TestCase {
- public void testSetSelectionNotifiesObservable() throws Exception {
- Shell shell = new Shell();
- Button button = new Button(shell, SWT.CHECK);
-
- ButtonObservableValue observableValue = new ButtonObservableValue(
+ private Shell shell;
+ private Button button;
+ private ButtonObservableValue observableValue;
+ private ValueChangeEventTracker listener;
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#setUp()
+ */
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ shell = new Shell();
+ button = new Button(shell, SWT.CHECK);
+ observableValue = new ButtonObservableValue(
button);
- ValueChangeEventTracker listener = new ValueChangeEventTracker();
+ listener = new ValueChangeEventTracker();
+ }
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#tearDown()
+ */
+ protected void tearDown() throws Exception {
+ shell.dispose();
+
+ super.tearDown();
+ }
+
+ public void testSelection_ChangeNotifiesObservable() throws Exception {
observableValue.addValueChangeListener(listener);
button.setSelection(true);
@@ -47,7 +68,18 @@
assertEquals("Selection event should notify observable.", 1,
listener.count);
- shell.dispose();
+ }
+
+ public void testSelection_NoChange() throws Exception {
+ button.setSelection(true);
+ button.notifyListeners(SWT.Selection, null);
+ observableValue.addValueChangeListener(listener);
+
+ //precondition
+ assertEquals(0, listener.count);
+
+ button.notifyListeners(SWT.Selection, null);
+ assertEquals("Value did not change. Listeners should not have been notified.", 0, listener.count);
}
public static Test suite() {
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/internal/swt/CComboObservableValueSelectionTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/internal/swt/CComboObservableValueSelectionTest.java
index 26e7a5f..48d60ec 100644
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/internal/swt/CComboObservableValueSelectionTest.java
+++ b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/internal/swt/CComboObservableValueSelectionTest.java
@@ -60,7 +60,6 @@
ValueChangeEventTracker listener = new ValueChangeEventTracker()
.register(observable);
combo.select(0);
- combo.notifyListeners(SWT.Selection, null);
assertEquals("Observable was not notified.", 1, listener.count);
}
@@ -103,7 +102,6 @@
.indexOf((String) createValue((IObservableValue) observable));
combo.select(index);
- combo.notifyListeners(SWT.Selection, null);
}
public Object getValueType(IObservableValue observable) {
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/internal/swt/CComboSingleSelectionObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/internal/swt/CComboSingleSelectionObservableValueTest.java
new file mode 100644
index 0000000..2a9473e
--- /dev/null
+++ b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/internal/swt/CComboSingleSelectionObservableValueTest.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Brad Reynolds and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Brad Reynolds - initial API and implementation
+ ******************************************************************************/
+
+package org.eclipse.jface.tests.internal.databinding.internal.swt;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+
+import org.eclipse.core.databinding.observable.IObservable;
+import org.eclipse.core.databinding.observable.Realm;
+import org.eclipse.core.databinding.observable.value.IObservableValue;
+import org.eclipse.jface.conformance.databinding.AbstractObservableValueContractDelegate;
+import org.eclipse.jface.conformance.databinding.SWTMutableObservableValueContractTest;
+import org.eclipse.jface.conformance.databinding.SWTObservableValueContractTest;
+import org.eclipse.jface.conformance.databinding.SuiteBuilder;
+import org.eclipse.jface.databinding.swt.ISWTObservable;
+import org.eclipse.jface.internal.databinding.internal.swt.CComboSingleSelectionObservableValue;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @since 3.2
+ */
+public class CComboSingleSelectionObservableValueTest extends TestCase {
+ public static Test suite() {
+ Delegate delegate = new Delegate();
+
+ return new SuiteBuilder().addObservableContractTest(
+ SWTObservableValueContractTest.class, delegate)
+ .addObservableContractTest(
+ SWTMutableObservableValueContractTest.class, delegate)
+ .build();
+ }
+
+ /* package */static class Delegate extends
+ AbstractObservableValueContractDelegate {
+ private CCombo combo;
+ private Shell shell;
+
+ public void setUp() {
+ shell = new Shell();
+ combo = new CCombo(shell, SWT.NONE);
+ combo.add("0");
+ combo.add("1");
+ }
+
+ public void tearDown() {
+ shell.dispose();
+ }
+
+ public IObservableValue createObservableValue(Realm realm) {
+ return new CComboSingleSelectionObservableValue(realm, combo);
+ }
+
+ public void change(IObservable observable) {
+ int index = _createValue((IObservableValue) observable);
+ combo.select(index);
+ combo.notifyListeners(SWT.Selection, null);
+ }
+
+ public Object getValueType(IObservableValue observable) {
+ return Integer.TYPE;
+ }
+
+ public Object createValue(IObservableValue observable) {
+ return new Integer(_createValue(observable));
+ }
+
+ private int _createValue(IObservableValue observable) {
+ CCombo combo = ((CCombo) ((ISWTObservable) observable).getWidget());
+ int value = Math.max(0, combo.getSelectionIndex());
+
+ //returns either 0 or 1 depending upon current value
+ return Math.abs(value - 1);
+ }
+ }
+}