Bug 549489 - TextCellEditor must convert empty string to null

Change-Id: I3d914fafe837a1f2e7f1a3ada27fdd6dd735f477
Signed-off-by: Eugen Neufeld <eneufeld@eclipsesource.com>
diff --git a/bundles/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/spi/swt/table/StringCellEditor.java b/bundles/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/spi/swt/table/StringCellEditor.java
index 06e3839..5372a11 100644
--- a/bundles/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/spi/swt/table/StringCellEditor.java
+++ b/bundles/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/spi/swt/table/StringCellEditor.java
@@ -18,6 +18,7 @@
 import org.eclipse.core.databinding.property.value.IValueProperty;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
+import org.eclipse.emf.edit.command.SetCommand;
 import org.eclipse.jface.databinding.swt.WidgetProperties;
 import org.eclipse.jface.databinding.viewers.CellEditorProperties;
 import org.eclipse.swt.SWT;
@@ -61,33 +62,16 @@
 		super(parent, style);
 	}
 
-	/**
-	 * {@inheritDoc}
-	 *
-	 * @see org.eclipse.emf.ecp.edit.spi.swt.table.ECPCellEditor#getValueProperty()
-	 */
 	@Override
 	public IValueProperty getValueProperty() {
 		return CellEditorProperties.control().value(WidgetProperties.text(SWT.FocusOut));
 	}
 
-	/**
-	 * {@inheritDoc}
-	 *
-	 * @see org.eclipse.emf.ecp.edit.spi.swt.table.ECPCellEditor#instantiate(org.eclipse.emf.ecore.EStructuralFeature,
-	 *      org.eclipse.emf.ecp.view.spi.context.ViewModelContext)
-	 */
 	@Override
 	public void instantiate(EStructuralFeature feature, ViewModelContext viewModelContext) {
 		eStructuralFeature = feature;
 	}
 
-	/**
-	 *
-	 * {@inheritDoc}
-	 *
-	 * @see org.eclipse.emf.ecp.edit.spi.swt.table.ECPCellEditor#getFormatedString(java.lang.Object)
-	 */
 	@Override
 	public String getFormatedString(Object value) {
 		if (value == null) {
@@ -96,47 +80,34 @@
 		return String.valueOf(value);
 	}
 
-	/**
-	 *
-	 * {@inheritDoc}
-	 *
-	 * @see org.eclipse.emf.ecp.edit.spi.swt.table.ECPCellEditor#getColumnWidthWeight()
-	 */
 	@Override
 	public int getColumnWidthWeight() {
 		return 100;
 	}
 
-	/**
-	 *
-	 * {@inheritDoc}
-	 *
-	 * @see org.eclipse.emf.ecp.edit.spi.swt.table.ECPCellEditor#getTargetToModelStrategy(org.eclipse.core.databinding.DataBindingContext)
-	 * @since 1.6
-	 */
 	@Override
 	public UpdateValueStrategy getTargetToModelStrategy(DataBindingContext databindingContext) {
-		return withPreSetValidation(eStructuralFeature, new UpdateValueStrategy());
+		return withPreSetValidation(eStructuralFeature, new UpdateValueStrategy() {
+
+			@Override
+			public Object convert(Object value) {
+				if ("".equals(value)) { //$NON-NLS-1$
+					value = null;
+				}
+				if (value == null && eStructuralFeature.isUnsettable()) {
+					return SetCommand.UNSET_VALUE;
+				}
+				return super.convert(value);
+			}
+
+		});
 	}
 
-	/**
-	 *
-	 * {@inheritDoc}
-	 *
-	 * @see org.eclipse.emf.ecp.edit.spi.swt.table.ECPCellEditor#getModelToTargetStrategy(org.eclipse.core.databinding.DataBindingContext)
-	 * @since 1.6
-	 */
 	@Override
 	public UpdateValueStrategy getModelToTargetStrategy(DataBindingContext databindingContext) {
 		return null;
 	}
 
-	/**
-	 *
-	 * {@inheritDoc}
-	 *
-	 * @see org.eclipse.emf.ecp.edit.spi.swt.table.ECPCellEditor#setEditable(boolean)
-	 */
 	@Override
 	public void setEditable(boolean editable) {
 		if (text != null) {
@@ -144,22 +115,11 @@
 		}
 	}
 
-	/**
-	 * {@inheritDoc}
-	 *
-	 * @see org.eclipse.emf.ecp.edit.spi.swt.table.ECPCellEditor#getImage(java.lang.Object)
-	 */
 	@Override
 	public Image getImage(Object value) {
 		return null;
 	}
 
-	/**
-	 * {@inheritDoc}
-	 *
-	 * @see org.eclipse.emf.ecp.edit.spi.swt.table.ECPCellEditor#getMinWidth()
-	 * @since 1.6
-	 */
 	@Override
 	public int getMinWidth() {
 		return 0;
diff --git a/tests/org.eclipse.emf.ecp.edit.swt.test/src/org/eclipse/emf/ecp/edit/spi/swt/table/StringCellEditor_PTest.java b/tests/org.eclipse.emf.ecp.edit.swt.test/src/org/eclipse/emf/ecp/edit/spi/swt/table/StringCellEditor_PTest.java
index 67f6c5f..aac8944 100644
--- a/tests/org.eclipse.emf.ecp.edit.swt.test/src/org/eclipse/emf/ecp/edit/spi/swt/table/StringCellEditor_PTest.java
+++ b/tests/org.eclipse.emf.ecp.edit.swt.test/src/org/eclipse/emf/ecp/edit/spi/swt/table/StringCellEditor_PTest.java
@@ -40,19 +40,24 @@
 	@Parameters(name = "Feature:{0} Expected Value:{2} isValid:{3}")
 	public static Object[] parameters() {
 		return new Object[][] {
-			{ TestDataPackage.eINSTANCE.getTestData_String(), TestDataFactory.eINSTANCE.createTestData(), "foo", true //$NON-NLS-1$
+			{ TestDataPackage.eINSTANCE.getTestData_String(), TestDataFactory.eINSTANCE.createTestData(), "foo", "foo", //$NON-NLS-1$ //$NON-NLS-2$
+				true
+			},
+			{ TestDataPackage.eINSTANCE.getTestData_String(), TestDataFactory.eINSTANCE.createTestData(), "", null, true //$NON-NLS-1$
 			},
 			{ TestDataPackage.eINSTANCE.getTestData_Boolean(), TestDataFactory.eINSTANCE.createTestData(),
-				Boolean.TRUE,
+				Boolean.TRUE, Boolean.TRUE,
 				true },
-			{ TestDataPackage.eINSTANCE.getTestData_Integer(), TestDataFactory.eINSTANCE.createTestData(), 2, true },
-			{ TestDataPackage.eINSTANCE.getTestData_Long(), TestDataFactory.eINSTANCE.createTestData(), 2L, true },
-			{ TestDataPackage.eINSTANCE.getTestData_Double(), TestDataFactory.eINSTANCE.createTestData(), 85.5d, true
+			{ TestDataPackage.eINSTANCE.getTestData_Integer(), TestDataFactory.eINSTANCE.createTestData(), 2, 2, true },
+			{ TestDataPackage.eINSTANCE.getTestData_Long(), TestDataFactory.eINSTANCE.createTestData(), 2L, 2L, true },
+			{ TestDataPackage.eINSTANCE.getTestData_Double(), TestDataFactory.eINSTANCE.createTestData(), 85.5d, 85.5d,
+				true
 			},
-			{ TestDataPackage.eINSTANCE.getTestData_Float(), TestDataFactory.eINSTANCE.createTestData(), 85.5f, true
+			{ TestDataPackage.eINSTANCE.getTestData_Float(), TestDataFactory.eINSTANCE.createTestData(), 85.5f, 85.5f,
+				true
 			},
 			{ TestDataPackage.eINSTANCE.getTestData_StringMax8(), TestDataFactory.eINSTANCE.createTestData(),
-				"extra long invalid string", false }, //$NON-NLS-1$
+				"extra long invalid string", "extra long invalid string", false }, //$NON-NLS-1$ //$NON-NLS-2$
 		};
 	}
 
@@ -64,11 +69,14 @@
 	private final Object newValue;
 	private final EObject eObject;
 	private final boolean valid;
+	private final Object expectedValue;
 
-	public StringCellEditor_PTest(EStructuralFeature feature, EObject eObject, Object newValue, boolean valid) {
+	public StringCellEditor_PTest(EStructuralFeature feature, EObject eObject, Object newValue, Object expectedValue,
+		boolean valid) {
 		this.feature = feature;
 		this.eObject = eObject;
 		this.newValue = newValue;
+		this.expectedValue = expectedValue;
 		this.valid = valid;
 
 	}
@@ -98,8 +106,8 @@
 		target.setValue(newValue.toString());
 		assertEquals(newValue.toString(), ((Text) editor.getControl()).getText());
 		if (valid) {
-			assertEquals(newValue, model.getValue());
-			assertEquals(target.getValue(), model.getValue().toString());
+			assertEquals(expectedValue, model.getValue());
+			assertEquals(target.getValue(), expectedValue == null ? "" : model.getValue().toString()); //$NON-NLS-1$
 		} else {
 			assertNull(model.getValue());
 		}