diff options
Diffstat (limited to 'plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/modelelement/UMLModelElement.java')
-rw-r--r-- | plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/modelelement/UMLModelElement.java | 59 |
1 files changed, 35 insertions, 24 deletions
diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/modelelement/UMLModelElement.java b/plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/modelelement/UMLModelElement.java index 4f71bd6f662..9a0f9a53124 100644 --- a/plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/modelelement/UMLModelElement.java +++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/modelelement/UMLModelElement.java @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2011, 2014 CEA LIST and others. + * Copyright (c) 2011, 2018 CEA LIST, Christian W. Damus, and others. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -8,14 +8,15 @@ * * Contributors: * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation - * Christian W. Damus (CEA) - bug 323802 - * Christian W. Damus (CEA) - bug 440108 + * Christian W. Damus (CEA) - bugs 323802, 440108 * Gabriel Pascual (ALL4TEC) gabriel.pascual@all4tec.net - Initial API and implementation * Nicolas FAUVERGUE (ALL4TEC) nicolas.fauvergue@all4tec.net - Bug 496905 + * Christian W. Damus - bug 507479 * *****************************************************************************/ package org.eclipse.papyrus.uml.properties.modelelement; +import static org.eclipse.emf.ecore.util.EcoreUtil.isAncestor; import static org.eclipse.uml2.uml.ParameterDirectionKind.INOUT_LITERAL; import static org.eclipse.uml2.uml.ParameterDirectionKind.IN_LITERAL; import static org.eclipse.uml2.uml.ParameterDirectionKind.OUT_LITERAL; @@ -24,7 +25,9 @@ import static org.eclipse.uml2.uml.ParameterDirectionKind.RETURN_LITERAL; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Optional; import java.util.Set; +import java.util.function.Predicate; import org.eclipse.core.databinding.observable.IObservable; import org.eclipse.core.databinding.observable.list.IObservableList; @@ -38,6 +41,7 @@ import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.edit.domain.EditingDomain; +import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.papyrus.infra.emf.utils.EMFHelper; import org.eclipse.papyrus.infra.emf.utils.HistoryUtil; @@ -74,6 +78,8 @@ import org.eclipse.papyrus.uml.tools.utils.NameResolutionHelper; import org.eclipse.uml2.uml.Connector; import org.eclipse.uml2.uml.Element; import org.eclipse.uml2.uml.Extension; +import org.eclipse.uml2.uml.Interaction; +import org.eclipse.uml2.uml.InteractionFragment; import org.eclipse.uml2.uml.Message; import org.eclipse.uml2.uml.NamedElement; import org.eclipse.uml2.uml.Namespace; @@ -179,30 +185,35 @@ public class UMLModelElement extends EMFModelElement { // Workaround: the standard ContentProvider does not correctly hide the selected elements in ReferenceSelector. // With a ContainmentBasedBrowseStrategy, it works better (But we don't have the infinite tree in the selection dialog). - if (feature == UMLPackage.eINSTANCE.getConstraint_ConstrainedElement()) { + if (feature == UMLPackage.Literals.CONSTRAINT__CONSTRAINED_ELEMENT) { return new ConstrainedElementContentProvider(source, feature); } - if (feature == UMLPackage.eINSTANCE.getMessage_Signature()) { - ResourceSet resourceSet = domain == null ? null : domain.getResourceSet(); - return new UMLContentProvider(source, feature, null, resourceSet) { - /** - * @see org.eclipse.papyrus.infra.widgets.providers.EncapsulatedContentProvider#isValidValue(java.lang.Object) - * - * @param element - * @return - */ - @Override - public boolean isValidValue(Object element) { - element = EMFHelper.getEObject(element); - // according to the UML norm 2.5, section 17.4.3.1 - // The signature of a Message refers to either an Operation or a Signal. - return element instanceof Operation || element instanceof Signal; - } - }; - } ResourceSet resourceSet = domain == null ? null : domain.getResourceSet(); - return new UMLContentProvider(source, feature, null, resourceSet); + Optional<Predicate<EObject>> isValid = Optional.empty(); + + if (feature == UMLPackage.Literals.MESSAGE__SIGNATURE) { + // according to the UML norm 2.5, section 17.4.3.1 + // The signature of a Message refers to either an Operation or a Signal. + isValid = Optional.of(element -> element instanceof Operation || element instanceof Signal); + } else if (feature == UMLPackage.Literals.INTERACTION_FRAGMENT__COVERED) { + // Can only cover a lifeline in the same interaction. So, allow any object in the same + // interaction or that contains the interaction (so that it may be reached in the tree) + InteractionFragment self = (InteractionFragment) this.source; + Interaction myInteraction = (Interaction) EMFCoreUtil.getContainer(self, UMLPackage.Literals.INTERACTION); + isValid = Optional.ofNullable(myInteraction) + .map(interaction -> element -> isAncestor(interaction, element)); + } + + return isValid.map( + valid -> new UMLContentProvider(source, feature, null, resourceSet) { + @Override + public boolean isValidValue(Object element) { + EObject eObject = EMFHelper.getEObject(element); + return valid.test(eObject) && super.isValidValue(element); + } + }) + .orElseGet(() -> new UMLContentProvider(source, feature, null, resourceSet)); } @Override @@ -265,7 +276,7 @@ public class UMLModelElement extends EMFModelElement { @Override protected List<EClass> getAvailableEClasses() { // according to the UML norm 2.5, section 17.4.3.1 - // The signature of a Message refers to either an Operation or a Signal. + // The signature of a Message refers to either an Operation or a Signal. final List<EClass> eClasses = new ArrayList<EClass>(); eClasses.add(UMLPackage.eINSTANCE.getOperation()); eClasses.add(UMLPackage.eINSTANCE.getSignal()); |