diff options
author | Fanch BONNABESSE | 2017-01-12 09:08:07 +0000 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org | 2017-01-26 15:21:46 +0000 |
commit | 123fc9e7e4da6df8b453986b9ad499241ea8bb74 (patch) | |
tree | bddcc680a0831081a5c7fc93ddde93a1344aaf7b | |
parent | 7656d60675284f0a10e5f462917bd7f255ac00ec (diff) | |
download | org.eclipse.papyrus-123fc9e7e4da6df8b453986b9ad499241ea8bb74.tar.gz org.eclipse.papyrus-123fc9e7e4da6df8b453986b9ad499241ea8bb74.tar.xz org.eclipse.papyrus-123fc9e7e4da6df8b453986b9ad499241ea8bb74.zip |
Bug 509688: [Property View] Widget displayed in properties pages for
DataTypes does not take into account the multiplicity
https://bugs.eclipse.org/bugs/show_bug.cgi?id=509688
Taking into account multiplicity.
Change-Id: Ica337a1277d38a94ba77fde3fd01d932c39f5dd2
Signed-off-by: Fanch BONNABESSE <fanch.bonnabesse@all4tec.net>
8 files changed, 380 insertions, 78 deletions
diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/databinding/EObjectObservableValueEditingSupport.java b/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/databinding/EObjectObservableValueEditingSupport.java index 457f0f68d92..30ec07f3561 100644 --- a/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/databinding/EObjectObservableValueEditingSupport.java +++ b/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/databinding/EObjectObservableValueEditingSupport.java @@ -15,6 +15,7 @@ package org.eclipse.papyrus.infra.ui.emf.databinding; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; import org.eclipse.emf.databinding.EObjectObservableValue; @@ -32,6 +33,11 @@ import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.papyrus.infra.widgets.Activator; import org.eclipse.papyrus.infra.widgets.creation.ReferenceValueFactory; +import org.eclipse.papyrus.infra.widgets.providers.AbstractStaticContentProvider; +import org.eclipse.papyrus.infra.widgets.selectors.BooleanSelector; +import org.eclipse.papyrus.infra.widgets.selectors.IntegerSelector; +import org.eclipse.papyrus.infra.widgets.selectors.ReferenceSelector; +import org.eclipse.papyrus.infra.widgets.selectors.StringSelector; import org.eclipse.swt.SWT; /** @@ -41,7 +47,7 @@ import org.eclipse.swt.SWT; */ public class EObjectObservableValueEditingSupport extends EditingSupport { - /** proposals for boolean */ + /** Proposals for boolean */ protected final String[] booleanProposals = new String[] { "true", "false" }; //$NON-NLS-1$ //$NON-NLS-2$ /** @@ -58,8 +64,6 @@ public class EObjectObservableValueEditingSupport extends EditingSupport { /** * {@inheritDoc} - * - * @see org.eclipse.jface.viewers.EditingSupport#canEdit(java.lang.Object) */ @Override protected boolean canEdit(final Object element) { @@ -68,8 +72,6 @@ public class EObjectObservableValueEditingSupport extends EditingSupport { /** * {@inheritDoc} - * - * @see org.eclipse.jface.viewers.EditingSupport#getCellEditor(java.lang.Object) */ @Override protected CellEditor getCellEditor(final Object element) { @@ -83,17 +85,21 @@ public class EObjectObservableValueEditingSupport extends EditingSupport { } EClassifier eType = feature.getEType(); - if (eType instanceof EEnum) { - return createEnumerationEditor(feature); + if (feature.isMany()) { + return createMultipleCellEditor(feature, (EObjectObservableValue) element); } else { - String instanceTypeName = eType.getInstanceClassName(); - if (instanceTypeName.equals("boolean")) { //$NON-NLS-1$ - return createBooleanEditor(); + if (eType instanceof EEnum) { + return createEnumerationEditor(feature); + } else { + String eTypeName = eType.getName(); + if (eTypeName.equals("Boolean")) { //$NON-NLS-1$ + return createBooleanEditor(); + } } - } - if (eType instanceof EDataType) { - return new EDataTypeCellEditor((EDataType) eType, ((TreeViewer) getViewer()).getTree()); + if (eType instanceof EDataType) { + return new EDataTypeCellEditor((EDataType) eType, ((TreeViewer) getViewer()).getTree()); + } } } } @@ -101,9 +107,46 @@ public class EObjectObservableValueEditingSupport extends EditingSupport { } /** - * {@inheritDoc} + * Create a cell editor which opened a dialog to select multiple value. * - * @see org.eclipse.jface.viewers.EditingSupport#getValue(java.lang.Object) + * @return The CellEditor. + */ + private CellEditor createMultipleCellEditor(EStructuralFeature feature, EObjectObservableValue element) { + EClassifier eType = feature.getEType(); + MultipleCellEditor multiEditor = new MultipleCellEditor(((TreeViewer) getViewer()).getTree(), ((EObjectObservableValue) element).getObserved(), feature); + if (eType instanceof EEnum) { + ReferenceSelector referenceSelector = new ReferenceSelector(true); + referenceSelector.setContentProvider(new AbstractStaticContentProvider() { + + @Override + public Object[] getElements() { + return ((EEnum) eType).getELiterals().toArray(); + } + }); + + multiEditor.setSelector(referenceSelector); + } else { + String eTypeName = eType.getName(); + switch (eTypeName) { + case "Integer": //$NON-NLS-1$ + multiEditor.setSelector(new IntegerSelector()); + break; + case "Boolean": //$NON-NLS-1$ + BooleanSelector booleanSelector = new BooleanSelector(); + multiEditor.setSelector(booleanSelector); + break; + case "String": //$NON-NLS-1$ + multiEditor.setSelector(new StringSelector()); + break; + default: + break; + } + } + return multiEditor; + } + + /** + * {@inheritDoc} */ @Override protected Object getValue(final Object element) { @@ -115,15 +158,19 @@ public class EObjectObservableValueEditingSupport extends EditingSupport { } EClassifier eType = feature.getEType(); Object object = ((EObjectObservableValue) element).getValue(); - if (eType instanceof EEnum) { - return getEnumerationValue((EEnum) eType, object); + if (feature.isMany()) { + return object; } else { - String instanceTypeName = eType.getInstanceClassName(); - if (instanceTypeName.equals("boolean")) { //$NON-NLS-1$ - return getBooleanValue(object); - } + if (eType instanceof EEnum) { + return getEnumerationValue((EEnum) eType, object); + } else { + String eTypeName = eType.getName(); + if (eTypeName.equals("Boolean")) { //$NON-NLS-1$ + return getBooleanValue(object); + } - return object; + return object; + } } } return null; @@ -163,8 +210,6 @@ public class EObjectObservableValueEditingSupport extends EditingSupport { /** * {@inheritDoc} - * - * @see org.eclipse.jface.viewers.EditingSupport#setValue(java.lang.Object, java.lang.Object) */ @SuppressWarnings("unchecked") @Override @@ -178,8 +223,8 @@ public class EObjectObservableValueEditingSupport extends EditingSupport { if (eType instanceof EEnum) { setEnumerationValue((EObjectObservableValue) element, value); } else { - String instanceTypeName = eType.getInstanceClassName(); - if (instanceTypeName.equals("boolean")) { //$NON-NLS-1$ + String eTypeName = eType.getName(); + if (eTypeName.equals("Boolean")) { //$NON-NLS-1$ setBooleanValue((EObjectObservableValue) element, value); } else { ((EObjectObservableValue) element).setValue(value); @@ -204,19 +249,40 @@ public class EObjectObservableValueEditingSupport extends EditingSupport { EStructuralFeature feature = (EStructuralFeature) element.getValueType(); EEnum eType = (EEnum) feature.getEType(); List<EEnumLiteral> literals = eType.getELiterals(); + List<String> proposals = new ArrayList<>(); for (int i = 0; i < literals.size(); i++) { // i+1 because there is already the "" string proposals.add(i, literals.get(i).getLiteral()); } + if (null == value) { element.setValue(null); } else { - // retrieve the index of the current value in the list - int index = (Integer) value; - if (index >= 0 && index < literals.size()) { - element.setValue(literals.get(index)); + if (value instanceof Collection<?>) { + List<EEnumLiteral> literalsToSet = new ArrayList<EEnumLiteral>(); + for (Object object : ((Collection<Object>) value)) { + if (object instanceof EEnumLiteral) { + literalsToSet.add((EEnumLiteral) object); + } else if (object instanceof Integer) { + // retrieve the index of the current value in the list + int index = (Integer) value; + if (index >= 0 && index < literals.size()) { + literalsToSet.add(literals.get(index)); + } + } + } + + element.setValue(literalsToSet); + + } else { + // retrieve the index of the current value in the list + int index = (Integer) value; + if (index >= 0 && index < literals.size()) { + element.setValue(literals.get(index)); + } } + } } @@ -230,14 +296,19 @@ public class EObjectObservableValueEditingSupport extends EditingSupport { */ @SuppressWarnings("unchecked") protected void setBooleanValue(final EObjectObservableValue element, final Object value) { - if (null == value) { - // propertiesToUpdate.remove(featureName); - } else if (value.equals(0)) { - element.setValue(Boolean.valueOf(booleanProposals[0])); - } else if (value.equals(1)) { - element.setValue(Boolean.valueOf(booleanProposals[1])); + if (value instanceof Collection<?>) { + element.setValue(value); } else { - Activator.log.error("impossible to set boolean value " + value, null); //$NON-NLS-1$ + if (null == value) { + // Do Nothing + // propertiesToUpdate.remove(featureName); + } else if (value.equals(0)) { + element.setValue(Boolean.valueOf(booleanProposals[0])); + } else if (value.equals(1)) { + element.setValue(Boolean.valueOf(booleanProposals[1])); + } else { + Activator.log.error("impossible to set boolean value " + value, null); //$NON-NLS-1$ + } } } diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/databinding/EObjectStructuredObservableValue.java b/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/databinding/EObjectStructuredObservableValue.java index fd6ee4c4fd3..7bbd0f3f823 100644 --- a/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/databinding/EObjectStructuredObservableValue.java +++ b/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/databinding/EObjectStructuredObservableValue.java @@ -36,6 +36,11 @@ public class EObjectStructuredObservableValue extends EMFObservableValue { protected List<EObjectObservableValue> observables = new ArrayList<>(); /** + * The parent of this EObjectStructuredObservableValue. + */ + protected EObjectStructuredObservableValue parent; + + /** * Constructor. * * @param eObject @@ -47,8 +52,9 @@ public class EObjectStructuredObservableValue extends EMFObservableValue { * @param browseFeatures * The features for the browse. */ - public EObjectStructuredObservableValue(EObject eObject, EStructuralFeature eStructuralFeature, EditingDomain domain, boolean browseFeatures) { + public EObjectStructuredObservableValue(final EObject eObject, final EStructuralFeature eStructuralFeature, final EditingDomain domain, final boolean browseFeatures, final EObjectStructuredObservableValue parent) { super(eObject, eStructuralFeature, domain); + this.parent = parent; if (null != eObject) { if (browseFeatures) { browseFeatures(eObject); @@ -66,6 +72,15 @@ public class EObjectStructuredObservableValue extends EMFObservableValue { } /** + * Get the parent. + * + * @return The parent. + */ + public EObjectStructuredObservableValue getParent() { + return parent; + } + + /** * Crete the child. * * @param eObject @@ -78,9 +93,9 @@ public class EObjectStructuredObservableValue extends EMFObservableValue { EObjectObservableValue eObjectObservableValue; Object eGet = eObject.eGet(eStructuralFeature); if (eStructuralFeature instanceof EReference && eGet instanceof EObject) { - eObjectObservableValue = new EObjectStructuredObservableValue((EObject) eGet, eStructuralFeature, editingDomain, true); + eObjectObservableValue = new EObjectStructuredObservableValue((EObject) eGet, eStructuralFeature, editingDomain, true, this); } else { - eObjectObservableValue = new EObjectStructuredObservableValue(eObject, eStructuralFeature, editingDomain, false); + eObjectObservableValue = new EObjectStructuredObservableValue(eObject, eStructuralFeature, editingDomain, false, this); } observables.add(eObjectObservableValue); } diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/databinding/MultipleCellEditor.java b/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/databinding/MultipleCellEditor.java new file mode 100644 index 00000000000..abae3e7678c --- /dev/null +++ b/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/databinding/MultipleCellEditor.java @@ -0,0 +1,101 @@ +/***************************************************************************** + * Copyright (c) 2017 CEA LIST 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: + * Fanch BONNABESSE (ALL4TEC) fanch.bonnabesse@all4tec.net - Initial API and implementation + * + *****************************************************************************/ + +package org.eclipse.papyrus.infra.ui.emf.databinding; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.jface.viewers.DialogCellEditor; +import org.eclipse.jface.window.Window; +import org.eclipse.papyrus.infra.widgets.editors.IElementSelector; +import org.eclipse.papyrus.infra.widgets.editors.MultipleValueSelectionDialog; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; + +/** + * A CellEditor uses to set multiple values of an object. + */ +public class MultipleCellEditor extends DialogCellEditor { + + /** + * The object to edit. + */ + private Object context; + + /** + * The IElementSelector + */ + private IElementSelector selector; + + /** + * + */ + private EStructuralFeature feature; + + /** + * Constructor. + * + * @param composite + * @param labelProvider + */ + public MultipleCellEditor(Composite composite, Object context, EStructuralFeature feature) { + super(composite); + this.context = context; + this.feature = feature; + + } + + /** + * Set the IElementSelector. + * + * @param selector + * The IElementSelector. + */ + public void setSelector(IElementSelector selector) { + this.selector = selector; + } + + /** + * {@inheritDoc} + */ + @Override + protected Object openDialogBox(Control cellEditorWindow) { + MultipleValueSelectionDialog multipleValueSelectionDialog = new MultipleValueSelectionDialog(cellEditorWindow.getShell(), selector); + multipleValueSelectionDialog.setContextElement(context); + + List<Object> result = null; + + if (context instanceof EObject) { + Object value = ((EObject) context).eGet(this.feature); + if ((null != value) && (value instanceof Collection)) { + Collection<?> coll = (Collection<?>) value; + if (!coll.isEmpty()) { + multipleValueSelectionDialog.setInitialSelections(coll.toArray()); + result = new ArrayList<Object>(coll); + } + } + } + + if (Window.OK == multipleValueSelectionDialog.open()) { + result = Arrays.asList(multipleValueSelectionDialog.getResult()); + } + + return result; + } + +} diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/dialog/EObjectTreeReferenceValueEditor.java b/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/dialog/EObjectTreeReferenceValueEditor.java index 046174a3478..e5ee9bd2370 100644 --- a/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/dialog/EObjectTreeReferenceValueEditor.java +++ b/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/dialog/EObjectTreeReferenceValueEditor.java @@ -13,12 +13,22 @@ package org.eclipse.papyrus.infra.ui.emf.dialog; +import java.util.ArrayList; +import java.util.List; + import org.eclipse.core.databinding.observable.value.IObservableValue; +import org.eclipse.emf.common.util.BasicEList; +import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.emf.transaction.util.TransactionUtil; import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider; import org.eclipse.jface.viewers.EditingSupport; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.ITreeSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.papyrus.infra.ui.emf.databinding.EObjectObservableValueEditingSupport; import org.eclipse.papyrus.infra.ui.emf.databinding.EObjectStructuredObservableValue; import org.eclipse.papyrus.infra.ui.emf.providers.EObjectObservableValueContentProvider; @@ -33,6 +43,11 @@ import org.eclipse.swt.widgets.Composite; public class EObjectTreeReferenceValueEditor extends TreeReferenceValueEditor { /** + * ObservableValues contained on the ValueEditor. + */ + private List<EObjectStructuredObservableValue> observableValues = new ArrayList<EObjectStructuredObservableValue>(); + + /** * Constructor. * * @param parent @@ -42,30 +57,39 @@ public class EObjectTreeReferenceValueEditor extends TreeReferenceValueEditor { */ public EObjectTreeReferenceValueEditor(final Composite parent, final int style) { super(parent, style); + treeViewer.addSelectionChangedListener(new ISelectionChangedListener() { + + @Override + public void selectionChanged(SelectionChangedEvent event) { + ISelection selection = event.getSelection(); + + if (null == selection || selection.isEmpty()) { + unsetButton.setEnabled(false); + } else { + unsetButton.setEnabled(true); + } + } + }); } /** * {@inheritDoc} - * - * @see org.eclipse.papyrus.infra.widgets.editors.TreeReferenceValueEditor#setValueRootContentProvider() */ @Override public void setValueRootContentProvider() { if (null != treeViewer) { if (treeViewer.getContentProvider() instanceof EObjectObservableValueContentProvider) { - ((EObjectObservableValueContentProvider) treeViewer.getContentProvider()).setValueRoot(widgetObservable); + ((EObjectObservableValueContentProvider) treeViewer.getContentProvider()).setValueRoot(observableValues); } } } /** * {@inheritDoc} - * - * @see org.eclipse.papyrus.infra.widgets.editors.TreeReferenceValueEditor#setProvidersTreeViewer() */ @Override public void setProvidersTreeViewer() { - treeViewer.setContentProvider(new EObjectObservableValueContentProvider(widgetObservable)); + treeViewer.setContentProvider(new EObjectObservableValueContentProvider(observableValues)); if (labelProvider instanceof IStyledLabelProvider) { treeViewer.setLabelProvider(new EObjectObservableValueLabelProvider((IStyledLabelProvider) labelProvider)); } else { @@ -73,32 +97,98 @@ public class EObjectTreeReferenceValueEditor extends TreeReferenceValueEditor { } treeViewer.setInput(""); //$NON-NLS-1$ + if (null != tree && null != tree.getTopItem()) { + treeViewer.expandToLevel(tree.getTopItem().getData(), 10); + } } /** * {@inheritDoc} - * - * @see org.eclipse.papyrus.infra.widgets.editors.TreeReferenceValueEditor#createWidgetObservable(org.eclipse.core.databinding.observable.value.IObservableValue) */ @SuppressWarnings("rawtypes") @Override public IObservableValue createWidgetObservable(final IObservableValue modelProperty) { EObjectStructuredObservableValue eObjectObser = null; + observableValues.clear(); if (modelProperty.getValue() instanceof EObject) { TransactionalEditingDomain editingDomain = TransactionUtil.getEditingDomain((EObject) modelProperty.getValue()); - eObjectObser = new EObjectStructuredObservableValue((EObject) modelProperty.getValue(), null, editingDomain, true); + eObjectObser = new EObjectStructuredObservableValue((EObject) modelProperty.getValue(), null, editingDomain, true, null); + observableValues.add(eObjectObser); + } else if (modelProperty.getValue() instanceof EList<?>) { + for (Object object : (EList<Object>) modelProperty.getValue()) { + if (object instanceof EObject) { + TransactionalEditingDomain editingDomain = TransactionUtil.getEditingDomain(object); + eObjectObser = new EObjectStructuredObservableValue((EObject) object, null, editingDomain, true, null); + observableValues.add(eObjectObser); + } + } } return eObjectObser; } /** * {@inheritDoc} - * - * @see org.eclipse.papyrus.infra.widgets.editors.TreeReferenceValueEditor#createEditingSupport() */ @Override public EditingSupport createEditingSupport() { return new EObjectObservableValueEditingSupport(treeViewer, valueFactory); } + /** + * {@inheritDoc} + */ + public void unsetAction() { + Object valueModelProperty = modelProperty.getValue(); + if (valueModelProperty instanceof EObject) { + setValue(null); + } else if (valueModelProperty instanceof EList<?>) { + ITreeSelection structuredSelection = treeViewer.getStructuredSelection(); + EList<?> eList = new BasicEList<Object>((EList<?>) valueModelProperty); + for (Object selection : structuredSelection.toList()) { + if (selection instanceof EObjectStructuredObservableValue) { + EObjectStructuredObservableValue rootObservableValue = getRootObservableValue((EObjectStructuredObservableValue) selection); + if (eList.contains(rootObservableValue.getObserved())) { + eList.remove(rootObservableValue.getObserved()); + } + } + } + setValue(eList); + } + checkCreateInstanceButton(); + } + + /** + * Returns the root parent of an EObjectStructuredObservableValue. + * + * @param observableValue + * The child ObservableValue. + * @return The root parent + */ + private EObjectStructuredObservableValue getRootObservableValue(final EObjectStructuredObservableValue observableValue) { + EObjectStructuredObservableValue parentRoot = observableValue; + + if (null != observableValue.getParent()) { + parentRoot = getRootObservableValue(observableValue.getParent()); + } + return parentRoot; + } + + /** + * {@inheritDoc} + */ + @Override + public void checkCreateInstanceButton() { + if (null != modelProperty && null != modelProperty.getValueType()) { + Object valueType = modelProperty.getValueType(); + if (valueType instanceof EReference) { + int upperBound = ((EReference) valueType).getUpperBound(); + int size = observableValues.size(); + if (-1 != upperBound && size >= upperBound) { + createInstanceButton.setEnabled(false); + } else { + createInstanceButton.setEnabled(true); + } + } + } + } } diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/providers/EObjectObservableValueContentProvider.java b/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/providers/EObjectObservableValueContentProvider.java index f0a9caeb39d..4755630fc71 100644 --- a/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/providers/EObjectObservableValueContentProvider.java +++ b/plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/providers/EObjectObservableValueContentProvider.java @@ -28,7 +28,7 @@ public class EObjectObservableValueContentProvider implements ITreeContentProvid /** * Value root of the tree. */ - private Object valueRoot = null; + private List<EObjectStructuredObservableValue> valueRoot = null; /** * Constructor. @@ -36,7 +36,7 @@ public class EObjectObservableValueContentProvider implements ITreeContentProvid * @param value * The value to manage. */ - public EObjectObservableValueContentProvider(final Object value) { + public EObjectObservableValueContentProvider(final List<EObjectStructuredObservableValue> value) { super(); valueRoot = value; } @@ -47,7 +47,7 @@ public class EObjectObservableValueContentProvider implements ITreeContentProvid * @param value * the root value */ - public void setValueRoot(final Object value) { + public void setValueRoot(final List<EObjectStructuredObservableValue> value) { this.valueRoot = value; } @@ -58,13 +58,10 @@ public class EObjectObservableValueContentProvider implements ITreeContentProvid */ @Override public Object[] getElements(final Object inputElement) { - ArrayList<Object> arrayList = new ArrayList<>(); if (null != valueRoot) { - arrayList.add(valueRoot); + return valueRoot.toArray(); } - - - return arrayList.toArray(); + return null; } /** diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.ui/src/org/eclipse/papyrus/infra/properties/ui/modelelement/EObjectStructuredValueFactory.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.ui/src/org/eclipse/papyrus/infra/properties/ui/modelelement/EObjectStructuredValueFactory.java index 39d9c59b3e9..ab2cd37914a 100644 --- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.ui/src/org/eclipse/papyrus/infra/properties/ui/modelelement/EObjectStructuredValueFactory.java +++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.ui/src/org/eclipse/papyrus/infra/properties/ui/modelelement/EObjectStructuredValueFactory.java @@ -44,8 +44,6 @@ public class EObjectStructuredValueFactory extends EObjectDirectEditingValueFact /** * {@inheritDoc} - * - * @see org.eclipse.papyrus.infra.properties.ui.creation.EcorePropertyEditorFactory#doCreateObject(org.eclipse.swt.widgets.Control, java.lang.Object) */ @Override protected Object doCreateObject(final Control widget, final Object context) { @@ -100,8 +98,10 @@ public class EObjectStructuredValueFactory extends EObjectDirectEditingValueFact eGet = eObject.eGet(eStructuralFeature); } } + if (eGet instanceof EObject) { + createStructure((EObject) eGet); + } - createStructure((EObject) eGet); } } } diff --git a/plugins/infra/ui/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/editors/TreeReferenceValueEditor.java b/plugins/infra/ui/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/editors/TreeReferenceValueEditor.java index 49050bbceb9..999c2b8c85a 100644 --- a/plugins/infra/ui/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/editors/TreeReferenceValueEditor.java +++ b/plugins/infra/ui/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/editors/TreeReferenceValueEditor.java @@ -42,6 +42,7 @@ import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Tree; +import org.eclipse.swt.widgets.TreeItem; import org.eclipse.swt.widgets.Widget; /** @@ -118,14 +119,14 @@ public abstract class TreeReferenceValueEditor extends AbstractValueEditor imple ((GridLayout) getLayout()).numColumns += 1; // Create a parent composite to set the margin - final Composite gridComposite = factory.createComposite(this); + Composite gridComposite = factory.createComposite(this); gridComposite.setLayout(new GridLayout()); gridComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); compositeTree = factory.createComposite(gridComposite); final TreeColumnLayout treeColumnLayout = new TreeColumnLayout(); compositeTree.setLayout(treeColumnLayout); - final GridData compositeTreeGridData = new GridData(SWT.FILL, SWT.FILL, true, true); + final GridData compositeTreeGridData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); compositeTreeGridData.minimumHeight = 150; compositeTree.setLayoutData(compositeTreeGridData); @@ -145,8 +146,6 @@ public abstract class TreeReferenceValueEditor extends AbstractValueEditor imple columnValue.setEditingSupport(createEditingSupport()); - treeViewer.setAutoExpandLevel(10); - createButtons(); } @@ -154,17 +153,28 @@ public abstract class TreeReferenceValueEditor extends AbstractValueEditor imple * Create the buttons. */ protected void createButtons() { - ((GridLayout) getLayout()).numColumns += 2; + ((GridLayout) getLayout()).numColumns += 1; + + // Create a parent composite to set add the buttons on the top + final Composite gridComposite = factory.createComposite(this); + gridComposite.setLayout(new GridLayout(2, true)); + gridComposite.setLayoutData(new GridData(SWT.NONE, SWT.BEGINNING, false, false)); - createInstanceButton = factory.createButton(this, null, SWT.PUSH); + createInstanceButton = factory.createButton(gridComposite, null, SWT.PUSH); createInstanceButton.setImage(Activator.getDefault().getImage("/icons/Add_12x12.gif")); //$NON-NLS-1$ createInstanceButton.setToolTipText(Messages.ReferenceDialog_CreateANewObject); createInstanceButton.addSelectionListener(this); - unsetButton = factory.createButton(this, null, SWT.PUSH); + unsetButton = factory.createButton(gridComposite, null, SWT.PUSH); unsetButton.setImage(Activator.getDefault().getImage("/icons/Delete_12x12.gif")); //$NON-NLS-1$ unsetButton.setToolTipText(Messages.ReferenceDialog_UnsetValue); unsetButton.addSelectionListener(this); + + if (null != treeViewer && treeViewer.getSelection() != null && !treeViewer.getSelection().isEmpty()) { + unsetButton.setEnabled(true); + } else { + unsetButton.setEnabled(false); + } } /** @@ -187,6 +197,14 @@ public abstract class TreeReferenceValueEditor extends AbstractValueEditor imple Collection<Object> validatedObjects = valueFactory.validateObjects(Collections.singleton(value)); if (!validatedObjects.isEmpty()) { setValue(validatedObjects.iterator().next()); + if (null != tree) { + int itemsSize = tree.getItems().length; + TreeItem item = tree.getItem(itemsSize - 1); + if (null != item) { + treeViewer.expandToLevel(item.getData(), TreeViewer.ALL_LEVELS); + } + } + checkCreateInstanceButton(); } } }, NLS.bind(Messages.ReferenceDialog_setOperation, labelText)); @@ -194,14 +212,6 @@ public abstract class TreeReferenceValueEditor extends AbstractValueEditor imple } /** - * The action executed when the "unset" button is selected Sets the current - * reference to null. - */ - protected void unsetAction() { - setValue(null); - } - - /** * Sets the Label provider for this editor If the label provider is null, a * default one will be used. The same label provider is used for both the * editor's label and the selection dialog. @@ -254,6 +264,7 @@ public abstract class TreeReferenceValueEditor extends AbstractValueEditor imple super.setModelObservable(modelProperty); addEAdapters(); setWidgetObservable(createWidgetObservable(modelProperty)); + checkCreateInstanceButton(); } /** @@ -321,7 +332,7 @@ public abstract class TreeReferenceValueEditor extends AbstractValueEditor imple IContentProvider treeViewerContentProvider = treeViewer.getContentProvider(); if (null != treeViewerContentProvider) { setValueRootContentProvider(); - treeViewer.setInput(""); // $NON-NLS-1$ + treeViewer.refresh(); } } @@ -404,4 +415,13 @@ public abstract class TreeReferenceValueEditor extends AbstractValueEditor imple @SuppressWarnings("rawtypes") public abstract IObservableValue createWidgetObservable(final IObservableValue modelProperty); + /** + * Verify if the CreateInstance button should be enabled or not. + */ + public abstract void checkCreateInstanceButton(); + + /** + * Action associated to the Unset button. + */ + public abstract void unsetAction(); } diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/modelelement/StereotypeModelElement.java b/plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/modelelement/StereotypeModelElement.java index 56489cfa25c..47e5e8ff202 100644 --- a/plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/modelelement/StereotypeModelElement.java +++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/modelelement/StereotypeModelElement.java @@ -26,6 +26,7 @@ import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.edit.domain.EditingDomain; +import org.eclipse.papyrus.infra.emf.gmf.command.GMFtoEMFCommandWrapper; import org.eclipse.papyrus.infra.properties.ui.modelelement.EMFModelElement; import org.eclipse.papyrus.infra.properties.ui.modelelement.EObjectStructuredValueFactory; import org.eclipse.papyrus.infra.widgets.creation.ReferenceValueFactory; @@ -89,6 +90,13 @@ public class StereotypeModelElement extends EMFModelElement { } } + if (feature.getEType() instanceof EClass) { + if (DataTypeUtil.isDataTypeDefinition((EClass) feature.getEType(), getSource(featurePath))) { + return new org.eclipse.papyrus.infra.services.edit.ui.databinding.PapyrusObservableValue(getSource(featurePath), feature, domain, GMFtoEMFCommandWrapper::wrap); + } + } + + if (feature.getUpperBound() != 1) { return new PapyrusObservableList(EMFProperties.list(featurePath).observe(source), domain, getSource(featurePath), feature); } |