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);
+		}
+	}
+}