updated controls
table control has now funtional databinding
diff --git a/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/controls/TableControl.java b/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/controls/TableControl.java
index 238cd4c..762e98c 100644
--- a/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/controls/TableControl.java
+++ b/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/controls/TableControl.java
@@ -14,9 +14,8 @@
 

 import org.eclipse.emf.common.util.Diagnostic;

 import org.eclipse.emf.common.util.EList;

-import org.eclipse.emf.databinding.EMFUpdateValueStrategy;

+import org.eclipse.emf.databinding.EMFProperties;

 import org.eclipse.emf.databinding.edit.EMFEditObservables;

-import org.eclipse.emf.databinding.edit.EMFEditProperties;

 import org.eclipse.emf.ecore.EClass;

 import org.eclipse.emf.ecore.EObject;

 import org.eclipse.emf.ecore.EReference;

@@ -31,32 +30,24 @@
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;

 

 import org.eclipse.core.databinding.Binding;

-import org.eclipse.core.databinding.DataBindingContext;

-import org.eclipse.core.databinding.UpdateValueStrategy;

 import org.eclipse.core.databinding.observable.list.IObservableList;

-import org.eclipse.core.databinding.observable.set.IObservableSet;

+import org.eclipse.core.databinding.observable.map.IObservableMap;

 import org.eclipse.core.databinding.observable.value.IObservableValue;

-import org.eclipse.core.databinding.property.value.IValueProperty;

-import org.eclipse.core.runtime.IStatus;

-import org.eclipse.jface.databinding.fieldassist.ControlDecorationSupport;

-import org.eclipse.jface.databinding.swt.WidgetProperties;

-import org.eclipse.jface.databinding.viewers.CellEditorProperties;

+import org.eclipse.core.runtime.Assert;

+import org.eclipse.jface.databinding.swt.SWTObservables;

 import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;

 import org.eclipse.jface.databinding.viewers.ObservableMapCellLabelProvider;

-import org.eclipse.jface.databinding.viewers.ObservableValueEditingSupport;

 import org.eclipse.jface.layout.GridDataFactory;

 import org.eclipse.jface.layout.TableColumnLayout;

 import org.eclipse.jface.viewers.CellEditor;

-import org.eclipse.jface.viewers.ColumnViewer;

-import org.eclipse.jface.viewers.ColumnViewerEditor;

 import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;

-import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;

+import org.eclipse.jface.viewers.ColumnViewerEditorActivationListener;

+import org.eclipse.jface.viewers.ColumnViewerEditorDeactivationEvent;

 import org.eclipse.jface.viewers.ColumnWeightData;

 import org.eclipse.jface.viewers.EditingSupport;

 import org.eclipse.jface.viewers.IStructuredSelection;

 import org.eclipse.jface.viewers.TableViewer;

 import org.eclipse.jface.viewers.TableViewerColumn;

-import org.eclipse.jface.viewers.TableViewerEditor;

 import org.eclipse.jface.viewers.ViewerCell;

 import org.eclipse.swt.SWT;

 import org.eclipse.swt.events.SelectionAdapter;

@@ -67,7 +58,6 @@
 import org.eclipse.swt.layout.GridLayout;

 import org.eclipse.swt.widgets.Button;

 import org.eclipse.swt.widgets.Composite;

-import org.eclipse.swt.widgets.Control;

 import org.eclipse.swt.widgets.TableColumn;

 

 import java.util.Iterator;

@@ -121,69 +111,203 @@
 		composite.setLayout(new FillLayout(SWT.HORIZONTAL | SWT.VERTICAL));

 		tableViewer = new TableViewer(composite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION

 			| SWT.BORDER);

-

-		ObservableListContentProvider contentProvider = new ObservableListContentProvider();

-		tableViewer.setContentProvider(contentProvider);

 		tableViewer.getTable().setHeaderVisible(true);

 		tableViewer.getTable().setLinesVisible(true);

 

-		ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(tableViewer) {

-			@Override

-			protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {

-				return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL

-					|| event.eventType == ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION

-					|| event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED

-					|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;

-			}

-		};

+		// ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(tableViewer) {

+		// @Override

+		// protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {

+		// return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL

+		// || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION

+		// || event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED

+		// || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;

+		// }

+		// };

+		//

+		// TableViewerEditor.create(tableViewer, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL

+		// | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR | ColumnViewerEditor.TABBING_VERTICAL

+		// | ColumnViewerEditor.KEEP_EDITOR_ON_DOUBLE_CLICK | ColumnViewerEditor.KEYBOARD_ACTIVATION);

 

-		TableViewerEditor.create(tableViewer, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL

-			| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR | ColumnViewerEditor.TABBING_VERTICAL

-			| ColumnViewerEditor.KEEP_EDITOR_ON_DOUBLE_CLICK | ColumnViewerEditor.KEYBOARD_ACTIVATION);

-

-		list = EMFEditObservables.observeList(getModelElementContext().getEditingDomain(), getModelElementContext()

-			.getModelElement(), getStructuralFeature());

-		IObservableSet set = contentProvider.getKnownElements();

+		// create a content provider

+		ObservableListContentProvider cp = new ObservableListContentProvider();

 

 		EObject tempInstance = clazz.getEPackage().getEFactoryInstance().create(clazz);

 

-		for (EStructuralFeature feature : clazz.getEAllStructuralFeatures()) {

+		for (final EStructuralFeature feature : clazz.getEAllStructuralFeatures()) {

 			IItemPropertyDescriptor itemPropertyDescriptor = adapterFactoryItemDelegator.getPropertyDescriptor(

 				tempInstance, feature);

-			IValueProperty property = EMFEditProperties.value(getModelElementContext().getEditingDomain(), feature);

-

 			final CellEditor cellEditor = CellEditorFactory.INSTANCE.getCellEditor(itemPropertyDescriptor,

 				tempInstance, tableViewer.getTable());

-			IValueProperty editorProperty = CellEditorProperties.control().value(WidgetProperties.text(SWT.FocusOut));

-			int style = SWT.LEAD;

-			if (ECPCellEditor.class.isInstance(cellEditor)) {

-				editorProperty = ((ECPCellEditor) cellEditor).getValueProperty();

-				style = ((ECPCellEditor) cellEditor).getStyle();

-			}

+			// create a new column

+			TableViewerColumn column = new TableViewerColumn(tableViewer, cellEditor.getStyle());

+			// determine the attribute that should be observed

+			IObservableMap map = EMFProperties.value(feature).observeDetail(cp.getKnownElements());

+			column.setLabelProvider(new ObservableMapCellLabelProvider(map) {

+				@Override

+				public void update(ViewerCell cell) {

+					Object element = cell.getElement();

+					Object value = attributeMaps[0].get(element);

 

-			TableViewerColumn column = new TableViewerColumn(tableViewer, style);

+					if (ECPCellEditor.class.isInstance(cellEditor)) {

+						ECPCellEditor ecpCellEditor = (ECPCellEditor) cellEditor;

+						String text = ecpCellEditor.getFormatedString(value);

+						cell.setText(text == null ? "" : text);

+					} else {

+						cell.setText(value == null ? "" : value.toString()); //$NON-NLS-1$

+					}

+				}

+			});

+

+			// set the column title & set the size

 			column.getColumn().setText(itemPropertyDescriptor.getDisplayName(null));

 			column.getColumn().setToolTipText(itemPropertyDescriptor.getDescription(null));

 			column.getColumn().setResizable(false);

 			column.getColumn().setMoveable(false);

-			EditingSupport editingSupport = createEditingSupport(tableViewer, getDataBindingContext(), cellEditor,

-				editorProperty, property);

-			column.setEditingSupport(editingSupport);

-			column.setLabelProvider(new ObservableMapCellLabelProvider(property.observeDetail(set)) {

+

+			EditingSupport observableSupport = new EditingSupport(tableViewer) {

+				private EditingState editingState;

+

+				private final ColumnViewerEditorActivationListenerHelper activationListener = new ColumnViewerEditorActivationListenerHelper();

+

+				/**

+				 * 

+				 * Default implementation always returns <code>true</code>.

+				 * 

+				 * @see org.eclipse.jface.viewers.EditingSupport#canEdit(java.lang.Object)

+				 */

 				@Override

-				public void update(ViewerCell cell) {

-					// if(cellEditor..){

-					// cell.setBackground(cell.getControl().getShell().getDisplay().getSystemColor(SWT.COLOR_RED));

-					// }

-					// else{

-					// cell.setBackground(null);

-					// }

-					super.update(cell);

+				protected boolean canEdit(Object element) {

+					return true;

 				}

 

-			});

+				/**

+				 * Default implementation always returns <code>null</code> as this will be

+				 * handled by the Binding.

+				 * 

+				 * @see org.eclipse.jface.viewers.EditingSupport#getValue(java.lang.Object)

+				 */

+				@Override

+				protected Object getValue(Object element) {

+					// no op

+					return null;

+				}

+

+				/**

+				 * Default implementation does nothing as this will be handled by the

+				 * Binding.

+				 * 

+				 * @see org.eclipse.jface.viewers.EditingSupport#setValue(java.lang.Object, java.lang.Object)

+				 */

+				@Override

+				protected void setValue(Object element, Object value) {

+					// no op

+				}

+

+				/**

+				 * Creates a {@link Binding} between the editor and the element to be

+				 * edited. Invokes {@link #doCreateCellEditorObservable(CellEditor)},

+				 * {@link #doCreateElementObservable(Object, ViewerCell)}, and then

+				 * {@link #createBinding(IObservableValue, IObservableValue)}.

+				 */

+				@Override

+				protected void initializeCellEditorValue(CellEditor cellEditor, ViewerCell cell) {

+					IObservableValue target = doCreateCellEditorObservable(cellEditor);

+					Assert.isNotNull(target, "doCreateCellEditorObservable(...) did not return an observable"); //$NON-NLS-1$

+

+					IObservableValue model = doCreateElementObservable(cell.getElement(), cell);

+					Assert.isNotNull(model, "doCreateElementObservable(...) did not return an observable"); //$NON-NLS-1$

+

+					Binding binding = createBinding(target, model);

+

+					Assert.isNotNull(binding, "createBinding(...) did not return a binding"); //$NON-NLS-1$

+

+					editingState = new EditingState(binding, target, model);

+

+					getViewer().getColumnViewerEditor().addEditorActivationListener(activationListener);

+				}

+

+				@Override

+				protected CellEditor getCellEditor(Object element) {

+					return cellEditor;

+				}

+

+				protected Binding createBinding(IObservableValue target, IObservableValue model) {

+					return getDataBindingContext().bindValue(target, model);

+				}

+

+				protected IObservableValue doCreateElementObservable(Object element, ViewerCell cell) {

+					return EMFEditObservables.observeValue(getModelElementContext().getEditingDomain(),

+						(EObject) element, feature);

+				}

+

+				protected IObservableValue doCreateCellEditorObservable(CellEditor cellEditor) {

+					if (ECPCellEditor.class.isInstance(cellEditor)) {

+						return ((ECPCellEditor) cellEditor).getValueProperty().observe(cellEditor);

+					}

+					return SWTObservables.observeText(cellEditor.getControl(), SWT.FocusOut);

+				}

+

+				@Override

+				final protected void saveCellEditorValue(CellEditor cellEditor, ViewerCell cell) {

+					editingState.binding.updateTargetToModel();

+				}

+

+				class ColumnViewerEditorActivationListenerHelper extends ColumnViewerEditorActivationListener {

+

+					@Override

+					public void afterEditorActivated(ColumnViewerEditorActivationEvent event) {

+						// do nothing

+					}

+

+					@Override

+					public void afterEditorDeactivated(ColumnViewerEditorDeactivationEvent event) {

+						editingState.dispose();

+						editingState = null;

+

+						getViewer().getColumnViewerEditor().removeEditorActivationListener(this);

+					}

+

+					@Override

+					public void beforeEditorActivated(ColumnViewerEditorActivationEvent event) {

+						// do nothing

+					}

+

+					@Override

+					public void beforeEditorDeactivated(ColumnViewerEditorDeactivationEvent event) {

+						// do nothing

+					}

+				}

+

+				/**

+				 * Maintains references to objects that only live for the length of the edit

+				 * cycle.

+				 */

+				class EditingState {

+					IObservableValue target;

+

+					IObservableValue model;

+

+					Binding binding;

+

+					EditingState(Binding binding, IObservableValue target, IObservableValue model) {

+						this.binding = binding;

+						this.target = target;

+						this.model = model;

+					}

+

+					void dispose() {

+						binding.dispose();

+						target.dispose();

+						model.dispose();

+					}

+				}

+			};

+			column.setEditingSupport(observableSupport);

 

 		}

+		tableViewer.setContentProvider(cp);

+		list = EMFEditObservables.observeList(getModelElementContext().getEditingDomain(), getModelElementContext()

+			.getModelElement(), getStructuralFeature());

 		tableViewer.setInput(list);

 		TableColumnLayout layout = new TableColumnLayout();

 		composite.setLayout(layout);

@@ -273,48 +397,6 @@
 		tableViewer.getTable().setEnabled(false);

 	}

 

-	private EditingSupport createEditingSupport(ColumnViewer viewer, DataBindingContext dbc,

-		final CellEditor cellEditor, final IValueProperty cellEditorProperty, final IValueProperty elementProperty) {

-		return new ObservableValueEditingSupport(viewer, dbc) {

-			@Override

-			protected IObservableValue doCreateCellEditorObservable(CellEditor cellEditor) {

-				return cellEditorProperty.observe(cellEditor);

-			}

-

-			@Override

-			protected IObservableValue doCreateElementObservable(Object element, ViewerCell cell) {

-				return elementProperty.observe(element);

-			}

-

-			@Override

-			protected CellEditor getCellEditor(Object element) {

-				return cellEditor;

-			}

-

-			@Override

-			protected Binding createBinding(IObservableValue target, IObservableValue model) {

-

-				Binding binding = getDataBindingContext().bindValue(target, model,

-					new EMFUpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE) {

-						@Override

-						public IStatus validateAfterGet(Object value) {

-							IStatus status = super.validateAfterGet(value);

-							Control control = cellEditor.getControl();

-							if (status.getSeverity() == IStatus.ERROR) {

-								control.setBackground(control.getShell().getDisplay().getSystemColor(SWT.COLOR_RED));

-							} else {

-								control.setBackground(null);

-							}

-							System.out.println("validateAfterGet " + status);

-							return status;

-						}

-					}, null);

-				ControlDecorationSupport.create(binding, SWT.TOP | SWT.LEFT);

-				return binding;

-			}

-		};

-	}

-

 	@SuppressWarnings({ "unchecked", "rawtypes" })

 	private void addRow(EClass clazz) {

 		EObject modelElement = getModelElementContext().getModelElement();

@@ -324,4 +406,5 @@
 		EObject instance = clazz.getEPackage().getEFactoryInstance().create(clazz);

 		list.add(instance);

 	}

+

 }

diff --git a/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/controls/XmlDateControl.java b/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/controls/XmlDateControl.java
index 3dffcc0..54c4341 100644
--- a/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/controls/XmlDateControl.java
+++ b/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/controls/XmlDateControl.java
@@ -1,11 +1,14 @@
 package org.eclipse.emf.ecp.edit.internal.swt.controls;

 

-import org.eclipse.core.databinding.observable.value.IObservableValue;

 import org.eclipse.emf.ecore.EStructuralFeature;

+import org.eclipse.emf.ecore.xml.type.internal.XMLCalendar;

 import org.eclipse.emf.ecp.edit.EditModelElementContext;

 import org.eclipse.emf.ecp.edit.internal.swt.Activator;

 import org.eclipse.emf.edit.command.SetCommand;

 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;

+

+import org.eclipse.core.databinding.UpdateValueStrategy;

+import org.eclipse.core.databinding.observable.value.IObservableValue;

 import org.eclipse.jface.databinding.swt.SWTObservables;

 import org.eclipse.jface.layout.GridDataFactory;

 import org.eclipse.jface.layout.GridLayoutFactory;

@@ -22,12 +25,17 @@
 import org.eclipse.swt.widgets.Label;

 import org.eclipse.ui.ISharedImages;

 

+import javax.xml.datatype.XMLGregorianCalendar;

+

+import java.util.Date;

+

 public class XmlDateControl extends SingleControl {

 

 	public XmlDateControl(boolean showLabel, IItemPropertyDescriptor itemPropertyDescriptor,

 		EStructuralFeature feature, EditModelElementContext modelElementContext, boolean embedded) {

 		super(showLabel, itemPropertyDescriptor, feature, modelElementContext, embedded);

 	}

+

 	private DateTime dateWidget;

 

 	private Composite parentComposite;

@@ -35,7 +43,7 @@
 	private StackLayout sl;

 

 	private Label unsetLabel;

-	

+

 	@Override

 	protected void fillInnerComposite(Composite composite) {

 		parentComposite = new Composite(composite, SWT.NONE);

@@ -48,7 +56,7 @@
 		createDateAndTimeWidget(dateTimeComposite);

 

 		unsetLabel = new Label(parentComposite, SWT.NONE);

-		//TODO language

+		// TODO language

 		unsetLabel.setText("No date set! Click to set date.");//$NON-NLS-1$

 		unsetLabel.setForeground(composite.getShell().getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));

 		unsetLabel.setAlignment(SWT.CENTER);

@@ -60,11 +68,11 @@
 			}

 

 			public void mouseDown(MouseEvent e) {

-				//nothing to do

+				// nothing to do

 			}

 

 			public void mouseDoubleClick(MouseEvent e) {

-				//nothing to do

+				// nothing to do

 			}

 		});

 		if (getModelElementContext().getModelElement().eIsSet(getStructuralFeature())) {

@@ -81,30 +89,34 @@
 			numColumns = 2;

 		}

 		GridLayoutFactory.fillDefaults().numColumns(numColumns).spacing(0, 0).equalWidth(false).applyTo(composite);

-		

-		dateWidget = new DateTime(composite, SWT.DATE|SWT.DROP_DOWN);

+

+		dateWidget = new DateTime(composite, SWT.DATE | SWT.DROP_DOWN);

 		dateWidget.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

-		

-		if(!isEmbedded()&&getStructuralFeature().isUnsettable()){

-			Button unsetdate=new Button(composite, SWT.PUSH);

+

+		if (!isEmbedded() && getStructuralFeature().isUnsettable()) {

+			Button unsetdate = new Button(composite, SWT.PUSH);

 			unsetdate.setToolTipText("UnsetDate");

-			unsetdate.setImage(Activator.getDefault().getWorkbench().getSharedImages().getImage(ISharedImages.IMG_TOOL_DELETE));

+			unsetdate.setImage(Activator.getDefault().getWorkbench().getSharedImages()

+				.getImage(ISharedImages.IMG_TOOL_DELETE));

 			unsetdate.addSelectionListener(new SelectionAdapter() {

 

 				@Override

 				public void widgetSelected(SelectionEvent e) {

-					getModelElementContext().getEditingDomain().getCommandStack().execute(

-						new SetCommand(getModelElementContext().getEditingDomain(), getModelElementContext().getModelElement(),

-							getStructuralFeature(), SetCommand.UNSET_VALUE));

+					getModelElementContext()

+						.getEditingDomain()

+						.getCommandStack()

+						.execute(

+							new SetCommand(getModelElementContext().getEditingDomain(), getModelElementContext()

+								.getModelElement(), getStructuralFeature(), SetCommand.UNSET_VALUE));

 

 					sl.topControl = unsetLabel;

 					parentComposite.layout();

 				}

-				

+

 			});

 		}

 	}

-	

+

 	@Override

 	public void setEditable(boolean isEditable) {

 		dateWidget.setEnabled(isEditable);

@@ -113,8 +125,21 @@
 	@Override

 	protected void bindValue() {

 		IObservableValue dateObserver = SWTObservables.observeSelection(dateWidget);

-		getDataBindingContext().bindValue(dateObserver, getModelValue());

-	}

+		getDataBindingContext().bindValue(dateObserver, getModelValue(), new UpdateValueStrategy() {

 

+			@Override

+			public Object convert(Object value) {

+				Date date = (Date) value;

+				return new XMLCalendar(date, XMLCalendar.DATE);

+			}

+

+		}, new UpdateValueStrategy() {

+			@Override

+			public Object convert(Object value) {

+				XMLGregorianCalendar gregorianCalendar = (XMLGregorianCalendar) value;

+				return gregorianCalendar.toGregorianCalendar().getTime();

+			}

+		});

+	}

 

 }

diff --git a/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/table/NumberCellEditor.java b/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/table/NumberCellEditor.java
index 5f4af47..908e585 100644
--- a/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/table/NumberCellEditor.java
+++ b/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/table/NumberCellEditor.java
@@ -1,22 +1,25 @@
 package org.eclipse.emf.ecp.edit.internal.swt.table;

 

-import org.eclipse.core.databinding.property.value.IValueProperty;

 import org.eclipse.emf.ecp.edit.internal.swt.util.ECPCellEditor;

 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;

+

+import org.eclipse.core.databinding.property.value.IValueProperty;

 import org.eclipse.jface.databinding.swt.WidgetProperties;

 import org.eclipse.jface.databinding.viewers.CellEditorProperties;

 import org.eclipse.jface.viewers.TextCellEditor;

 import org.eclipse.swt.SWT;

 import org.eclipse.swt.widgets.Composite;

 

-public class NumberCellEditor extends TextCellEditor implements ECPCellEditor{

+import java.math.BigDecimal;

+

+public class NumberCellEditor extends TextCellEditor implements ECPCellEditor {

 

 	public NumberCellEditor(Composite parent) {

-		super(parent,SWT.RIGHT);

+		super(parent, SWT.RIGHT);

 	}

 

 	public NumberCellEditor(Composite parent, int style) {

-		super(parent, style|SWT.RIGHT);

+		super(parent, style | SWT.RIGHT);

 	}

 

 	public IValueProperty getValueProperty() {

@@ -24,7 +27,23 @@
 	}

 

 	public void instantiate(IItemPropertyDescriptor descriptor) {

-		//do nothing

+		// do nothing

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * @see org.eclipse.emf.ecp.edit.internal.swt.util.ECPCellEditor#getFormatedString(java.lang.Object)

+	 */

+	public String getFormatedString(Object value) {

+		if (value == null) {

+			return "";

+		}

+

+		if (BigDecimal.class.isInstance(value)) {

+			BigDecimal bigDecimal = (BigDecimal) value;

+			bigDecimal.toPlainString();

+		}

+		return ((Number) value).toString();

 	}

 

 }

diff --git a/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/table/XmlDateCellEditor.java b/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/table/XmlDateCellEditor.java
index 138ea30..715d314 100644
--- a/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/table/XmlDateCellEditor.java
+++ b/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/table/XmlDateCellEditor.java
@@ -1,28 +1,38 @@
 package org.eclipse.emf.ecp.edit.internal.swt.table;

 

-import java.text.MessageFormat;

-

-import javax.xml.datatype.XMLGregorianCalendar;

-

-import org.eclipse.core.databinding.property.value.IValueProperty;

 import org.eclipse.emf.ecore.xml.type.internal.XMLCalendar;

 import org.eclipse.emf.ecp.edit.internal.swt.util.ECPCellEditor;

 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;

-import org.eclipse.jface.databinding.swt.WidgetProperties;

-import org.eclipse.jface.databinding.viewers.CellEditorProperties;

+

+import org.eclipse.core.databinding.observable.value.IObservableValue;

+import org.eclipse.core.databinding.property.value.IValueProperty;

+import org.eclipse.jface.databinding.swt.WidgetValueProperty;

 import org.eclipse.jface.viewers.CellEditor;

-import org.eclipse.jface.viewers.ISelection;

-import org.eclipse.jface.viewers.IStructuredSelection;

 import org.eclipse.swt.SWT;

+import org.eclipse.swt.events.FocusAdapter;

+import org.eclipse.swt.events.FocusEvent;

 import org.eclipse.swt.events.KeyAdapter;

 import org.eclipse.swt.events.KeyEvent;

+import org.eclipse.swt.events.SelectionAdapter;

+import org.eclipse.swt.events.SelectionEvent;

+import org.eclipse.swt.events.TraverseEvent;

+import org.eclipse.swt.events.TraverseListener;

 import org.eclipse.swt.widgets.Composite;

 import org.eclipse.swt.widgets.Control;

 import org.eclipse.swt.widgets.DateTime;

 

+import javax.xml.datatype.XMLGregorianCalendar;

+

+import java.text.DateFormat;

+import java.text.MessageFormat;

+import java.text.SimpleDateFormat;

+import java.util.Calendar;

+import java.util.GregorianCalendar;

+

 public class XmlDateCellEditor extends CellEditor implements ECPCellEditor {

 

 	private DateTime dateWidget;

+	private DateFormat dateFormat = SimpleDateFormat.getDateInstance(DateFormat.MEDIUM);

 

 	public XmlDateCellEditor() {

 		// TODO Auto-generated constructor stub

@@ -37,7 +47,30 @@
 	}

 

 	public IValueProperty getValueProperty() {

-		return CellEditorProperties.control().value(WidgetProperties.selection());

+		return new WidgetValueProperty() {

+

+			public Object getValueType() {

+				return XMLGregorianCalendar.class;

+			}

+

+			@Override

+			protected Object doGetValue(Object source) {

+				return XmlDateCellEditor.this.doGetValue();

+			}

+

+			@Override

+			protected void doSetValue(Object source, Object value) {

+				XmlDateCellEditor.this.doSetValue(value);

+			}

+

+			@Override

+			public IObservableValue observe(Object source) {

+				if (source instanceof XmlDateCellEditor) {

+					return observe(dateWidget);

+				}

+				return super.observe(source);

+			}

+		};

 	}

 

 	public void instantiate(IItemPropertyDescriptor descriptor) {

@@ -46,19 +79,46 @@
 

 	@Override

 	protected Control createControl(Composite parent) {

-		dateWidget = new DateTime(parent, SWT.DATE|SWT.DROP_DOWN);

+		dateWidget = new DateTime(parent, SWT.DATE | SWT.DROP_DOWN);

 		dateWidget.addKeyListener(new KeyAdapter() {

 			// hook key pressed - see PR 14201

+			@Override

 			public void keyPressed(KeyEvent e) {

 				keyReleaseOccured(e);

 			}

 		});

+		dateWidget.addSelectionListener(new SelectionAdapter() {

+			@Override

+			public void widgetDefaultSelected(SelectionEvent event) {

+				applyEditorValueAndDeactivate();

+			}

+

+		});

+

+		dateWidget.addTraverseListener(new TraverseListener() {

+			public void keyTraversed(TraverseEvent e) {

+				if (e.detail == SWT.TRAVERSE_ESCAPE || e.detail == SWT.TRAVERSE_RETURN) {

+					e.doit = false;

+				}

+			}

+		});

+

+		dateWidget.addFocusListener(new FocusAdapter() {

+			@Override

+			public void focusLost(FocusEvent e) {

+				XmlDateCellEditor.this.focusLost();

+			}

+		});

 		return dateWidget;

 	}

 

 	@Override

 	protected Object doGetValue() {

-		return new XMLCalendar(dateWidget.getYear()+"-"+dateWidget.getMonth()+"-"+dateWidget.getDay(), XMLCalendar.DATE);

+		Calendar selectedCalendarDate = Calendar.getInstance();

+		selectedCalendarDate.set(Calendar.YEAR, dateWidget.getYear());

+		selectedCalendarDate.set(Calendar.MONTH, dateWidget.getMonth());

+		selectedCalendarDate.set(Calendar.DAY_OF_MONTH, dateWidget.getDay());

+		return new XMLCalendar(selectedCalendarDate.getTime(), XMLCalendar.DATE);

 	}

 

 	@Override

@@ -68,14 +128,16 @@
 

 	@Override

 	protected void doSetValue(Object value) {

-		XMLGregorianCalendar cal=(XMLGregorianCalendar)value;

-		dateWidget.setDate(cal.getYear(), cal.getMonth(), cal.getDay());

+		XMLGregorianCalendar cal = (XMLGregorianCalendar) value;

+		GregorianCalendar gregCal = cal.toGregorianCalendar();

+		dateWidget.setDate(gregCal.get(Calendar.YEAR), gregCal.get(Calendar.MONTH), gregCal.get(Calendar.DAY_OF_MONTH));

 	}

+

 	/*

 	 * (non-Javadoc)

-	 *

 	 * @see org.eclipse.jface.viewers.CellEditor#focusLost()

 	 */

+	@Override

 	protected void focusLost() {

 		if (isActivated()) {

 			applyEditorValueAndDeactivate();

@@ -84,9 +146,9 @@
 

 	/*

 	 * (non-Javadoc)

-	 *

 	 * @see org.eclipse.jface.viewers.CellEditor#keyReleaseOccured(org.eclipse.swt.events.KeyEvent)

 	 */

+	@Override

 	protected void keyReleaseOccured(KeyEvent keyEvent) {

 		super.keyReleaseOccured(keyEvent);

 		if (keyEvent.character == '\u001b') { // Escape character

@@ -95,7 +157,7 @@
 			applyEditorValueAndDeactivate();

 		}

 	}

-	

+

 	/**

 	 * Applies the currently selected value and deactiavates the cell editor

 	 */

@@ -108,11 +170,22 @@
 		setValueValid(isValid);

 

 		if (!isValid) {

-			MessageFormat.format(getErrorMessage(),

-					new Object[] { newValue });

+			MessageFormat.format(getErrorMessage(), new Object[] { newValue });

 		}

 

 		fireApplyEditorValue();

 		deactivate();

 	}

+

+	/*

+	 * (non-Javadoc)

+	 * @see org.eclipse.emf.ecp.edit.internal.swt.util.ECPCellEditor#getFormatedString(java.lang.Object)

+	 */

+	public String getFormatedString(Object value) {

+		XMLGregorianCalendar cal = (XMLGregorianCalendar) value;

+		if (value == null) {

+			return "";

+		}

+		return dateFormat.format(cal.toGregorianCalendar().getTime());

+	}

 }

diff --git a/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/util/ECPCellEditor.java b/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/util/ECPCellEditor.java
index 62e1b3d..1dba990 100644
--- a/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/util/ECPCellEditor.java
+++ b/ECP2/org.eclipse.emf.ecp.edit.swt/src/org/eclipse/emf/ecp/edit/internal/swt/util/ECPCellEditor.java
@@ -1,10 +1,19 @@
 package org.eclipse.emf.ecp.edit.internal.swt.util;

 

-import org.eclipse.core.databinding.property.value.IValueProperty;

 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;

 

+import org.eclipse.core.databinding.property.value.IValueProperty;

+

 public interface ECPCellEditor {

 	IValueProperty getValueProperty();

+

 	void instantiate(IItemPropertyDescriptor descriptor);

+

 	int getStyle();

+

+	/**

+	 * @param value

+	 * @return

+	 */

+	String getFormatedString(Object value);

 }