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