Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFanch BONNABESSE2017-01-12 09:08:07 +0000
committerGerrit Code Review @ Eclipse.org2017-01-26 15:21:46 +0000
commit123fc9e7e4da6df8b453986b9ad499241ea8bb74 (patch)
treebddcc680a0831081a5c7fc93ddde93a1344aaf7b
parent7656d60675284f0a10e5f462917bd7f255ac00ec (diff)
downloadorg.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>
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/databinding/EObjectObservableValueEditingSupport.java145
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/databinding/EObjectStructuredObservableValue.java21
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/databinding/MultipleCellEditor.java101
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/dialog/EObjectTreeReferenceValueEditor.java112
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.ui.emf/src/org/eclipse/papyrus/infra/ui/emf/providers/EObjectObservableValueContentProvider.java13
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.ui/src/org/eclipse/papyrus/infra/properties/ui/modelelement/EObjectStructuredValueFactory.java6
-rw-r--r--plugins/infra/ui/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/editors/TreeReferenceValueEditor.java52
-rw-r--r--plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/modelelement/StereotypeModelElement.java8
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);
}

Back to the top