Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus')
-rw-r--r--plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/databinding/NavigationObservableValue.java57
-rw-r--r--plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/databinding/OwnerObservableValue.java17
-rw-r--r--plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/modelelement/MemberEndModelElement.java5
-rw-r--r--plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/modelelement/StereotypeApplicationFactory.java3
-rw-r--r--plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/modelelement/StereotypeApplicationModelElement.java18
-rw-r--r--plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/widgets/StereotypeApplication.java59
6 files changed, 143 insertions, 16 deletions
diff --git a/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/databinding/NavigationObservableValue.java b/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/databinding/NavigationObservableValue.java
index 9bc2a852cc7..7b2435f787a 100644
--- a/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/databinding/NavigationObservableValue.java
+++ b/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/databinding/NavigationObservableValue.java
@@ -12,10 +12,16 @@
package org.eclipse.papyrus.properties.uml.databinding;
import java.util.ArrayList;
+import java.util.LinkedList;
import java.util.List;
+import org.eclipse.core.databinding.observable.ChangeEvent;
+import org.eclipse.core.databinding.observable.Diffs;
+import org.eclipse.core.databinding.observable.IChangeListener;
+import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.CompoundCommand;
+import org.eclipse.emf.databinding.EMFProperties;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.domain.EditingDomain;
@@ -25,14 +31,13 @@ import org.eclipse.papyrus.diagram.common.command.wrappers.GMFtoEMFCommandWrappe
import org.eclipse.papyrus.service.edit.service.ElementEditServiceUtils;
import org.eclipse.papyrus.service.edit.service.IElementEditService;
import org.eclipse.uml2.uml.Association;
+import org.eclipse.uml2.uml.Classifier;
import org.eclipse.uml2.uml.Property;
import org.eclipse.uml2.uml.UMLPackage;
/**
* An ObservableValue for manipulating the UML Navigable property.
* The navigable property is a virtual property, represented as a Boolean.
- * This boolean is basically the result of the following query :
- * self.association.navigableOwnedEnd->contains(self)
*
* @author Camille Letavernier
*/
@@ -42,6 +47,8 @@ public class NavigationObservableValue extends AbstractObservableValue {
private EditingDomain domain;
+ private boolean currentValue;
+
/**
* Constructor.
*
@@ -53,6 +60,14 @@ public class NavigationObservableValue extends AbstractObservableValue {
public NavigationObservableValue(EObject source, EditingDomain domain) {
memberEnd = (Property)source;
this.domain = domain;
+ IObservableList ownerObservableList = EMFProperties.list(UMLPackage.eINSTANCE.getAssociation_OwnedEnd()).observe(memberEnd.getAssociation());
+ ownerObservableList.addChangeListener(new IChangeListener() {
+
+ public void handleChange(ChangeEvent event) {
+ fireValueChange(Diffs.createValueDiff(currentValue, doGetValue()));
+ }
+
+ });
}
public Object getValueType() {
@@ -61,37 +76,55 @@ public class NavigationObservableValue extends AbstractObservableValue {
@Override
protected Boolean doGetValue() {
- return memberEnd.getAssociation().getNavigableOwnedEnds().contains(memberEnd);
+ return memberEnd.isNavigable();
}
@Override
protected void doSetValue(Object value) {
if(value instanceof Boolean) {
boolean isNavigable = (Boolean)value;
-
- Command command = null;
+ if(memberEnd.isNavigable() == isNavigable) {
+ return;
+ }
Association association = memberEnd.getAssociation();
- EStructuralFeature navigableFeature = association.eClass().getEStructuralFeature(UMLPackage.ASSOCIATION__NAVIGABLE_OWNED_END);
-
List<Property> navigableEnds = new ArrayList<Property>();
navigableEnds.addAll(association.getNavigableOwnedEnds());
+
+ List<SetRequest> setRequests = new LinkedList<SetRequest>();
+
if(isNavigable) {
navigableEnds.add(memberEnd);
} else {
- navigableEnds.remove(memberEnd);
+ if(memberEnd.getOwningAssociation() == null && memberEnd.getOwner() instanceof Classifier) {
+ List<Property> ownedEnds = new LinkedList<Property>();
+ ownedEnds.addAll(association.getOwnedEnds());
+ ownedEnds.add(memberEnd);
+ setRequests.add(new SetRequest(association, UMLPackage.eINSTANCE.getAssociation_OwnedEnd(), ownedEnds));
+ }
+ if(navigableEnds.contains(memberEnd)) {
+ navigableEnds.remove(memberEnd);
+ }
}
+ EStructuralFeature navigableFeature = UMLPackage.eINSTANCE.getAssociation_NavigableOwnedEnd();
+ setRequests.add(new SetRequest(association, navigableFeature, navigableEnds));
+
+ CompoundCommand command = null;
+
IElementEditService provider = ElementEditServiceUtils.getCommandProvider(association);
if(provider != null) {
- SetRequest request = new SetRequest(association, navigableFeature, navigableEnds);
- ICommand createGMFCommand = provider.getEditCommand(request);
+ command = new CompoundCommand();
- command = new GMFtoEMFCommandWrapper(createGMFCommand);
+ for(SetRequest request : setRequests) {
+ ICommand createGMFCommand = provider.getEditCommand(request);
+ command.append(new GMFtoEMFCommandWrapper(createGMFCommand));
+ }
}
+ currentValue = isNavigable;
domain.getCommandStack().execute(command);
}
}
diff --git a/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/databinding/OwnerObservableValue.java b/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/databinding/OwnerObservableValue.java
index f3a6a5ef92a..1091df835d6 100644
--- a/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/databinding/OwnerObservableValue.java
+++ b/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/databinding/OwnerObservableValue.java
@@ -14,8 +14,13 @@ package org.eclipse.papyrus.properties.uml.databinding;
import java.util.ArrayList;
import java.util.List;
+import org.eclipse.core.databinding.observable.ChangeEvent;
+import org.eclipse.core.databinding.observable.Diffs;
+import org.eclipse.core.databinding.observable.IChangeListener;
+import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.databinding.EMFProperties;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.domain.EditingDomain;
@@ -49,6 +54,8 @@ public class OwnerObservableValue extends AbstractObservableValue {
private EditingDomain domain;
+ private String currentValue;
+
/**
* Constructor.
*
@@ -60,6 +67,14 @@ public class OwnerObservableValue extends AbstractObservableValue {
public OwnerObservableValue(EObject source, EditingDomain domain) {
this.memberEnd = (Property)source;
this.domain = domain;
+ IObservableList navigableEndsObservableList = EMFProperties.list(UMLPackage.eINSTANCE.getAssociation_NavigableOwnedEnd()).observe(memberEnd.getAssociation());
+ navigableEndsObservableList.addChangeListener(new IChangeListener() {
+
+ public void handleChange(ChangeEvent event) {
+ fireValueChange(Diffs.createValueDiff(currentValue, doGetValue()));
+ }
+
+ });
}
public Object getValueType() {
@@ -132,8 +147,8 @@ public class OwnerObservableValue extends AbstractObservableValue {
}
}
+ this.currentValue = owner;
domain.getCommandStack().execute(command);
}
}
-
}
diff --git a/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/modelelement/MemberEndModelElement.java b/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/modelelement/MemberEndModelElement.java
index c3a08c7ca3d..2a443ab2b73 100644
--- a/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/modelelement/MemberEndModelElement.java
+++ b/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/modelelement/MemberEndModelElement.java
@@ -81,4 +81,9 @@ public class MemberEndModelElement extends AbstractModelElement {
}
return true;
}
+
+ @Override
+ public boolean forceRefresh(String propertyPath) {
+ return propertyPath.equals("navigable") || propertyPath.equals("owner"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
}
diff --git a/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/modelelement/StereotypeApplicationFactory.java b/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/modelelement/StereotypeApplicationFactory.java
index baae2c5ad80..8dc67e26ce2 100644
--- a/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/modelelement/StereotypeApplicationFactory.java
+++ b/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/modelelement/StereotypeApplicationFactory.java
@@ -13,6 +13,7 @@ package org.eclipse.papyrus.properties.uml.modelelement;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.gef.EditPart;
import org.eclipse.papyrus.properties.Activator;
import org.eclipse.papyrus.properties.contexts.DataContextElement;
import org.eclipse.papyrus.properties.modelelement.ModelElement;
@@ -31,7 +32,7 @@ public class StereotypeApplicationFactory implements ModelElementFactory {
}
EditingDomain domain = AdapterFactoryEditingDomain.getEditingDomainFor(umlSource);
- return new StereotypeApplicationModelElement(umlSource, domain);
+ return new StereotypeApplicationModelElement((EditPart)sourceElement, domain);
}
}
diff --git a/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/modelelement/StereotypeApplicationModelElement.java b/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/modelelement/StereotypeApplicationModelElement.java
index 0df05819567..7f20a59f7e4 100644
--- a/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/modelelement/StereotypeApplicationModelElement.java
+++ b/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/modelelement/StereotypeApplicationModelElement.java
@@ -12,13 +12,16 @@
package org.eclipse.papyrus.properties.uml.modelelement;
import org.eclipse.core.databinding.observable.IObservable;
+import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.gef.EditPart;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.papyrus.diagram.common.providers.EditorLabelProvider;
import org.eclipse.papyrus.properties.modelelement.AbstractModelElement;
import org.eclipse.papyrus.properties.uml.databinding.ProfileApplicationObservableList;
import org.eclipse.papyrus.properties.uml.databinding.StereotypeApplicationObservableList;
import org.eclipse.papyrus.properties.uml.providers.ApplicableStereotypeContentProvider;
+import org.eclipse.papyrus.properties.uml.util.UMLUtil;
import org.eclipse.papyrus.widgets.providers.IStaticContentProvider;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.Package;
@@ -34,8 +37,11 @@ public class StereotypeApplicationModelElement extends AbstractModelElement {
private EditingDomain domain;
- public StereotypeApplicationModelElement(Element umlSource, EditingDomain domain) {
- this.umlSource = umlSource;
+ private EditPart sourceElement;
+
+ public StereotypeApplicationModelElement(EditPart sourceElement, EditingDomain domain) {
+ this.umlSource = UMLUtil.resolveUMLElement(sourceElement);
+ this.sourceElement = sourceElement;
this.domain = domain;
}
@@ -68,4 +74,12 @@ public class StereotypeApplicationModelElement extends AbstractModelElement {
public boolean isOrdered(String propertyPath) {
return false;
}
+
+ public EModelElement getEModelElement() {
+ return (EModelElement)sourceElement.getModel();
+ }
+
+ public EditPart getEditPart() {
+ return sourceElement;
+ }
}
diff --git a/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/widgets/StereotypeApplication.java b/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/widgets/StereotypeApplication.java
new file mode 100644
index 00000000000..82029a03035
--- /dev/null
+++ b/plugins/uml/org.eclipse.papyrus.properties.uml/src/org/eclipse/papyrus/properties/uml/widgets/StereotypeApplication.java
@@ -0,0 +1,59 @@
+package org.eclipse.papyrus.properties.uml.widgets;
+
+import java.util.Collections;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.papyrus.profile.tree.objects.StereotypedElementTreeObject;
+import org.eclipse.papyrus.profile.ui.compositeforview.AppliedStereotypeCompositeWithView;
+import org.eclipse.papyrus.profile.ui.compositeforview.AppliedStereotypePropertyCompositeWithView;
+import org.eclipse.papyrus.properties.modelelement.ModelElement;
+import org.eclipse.papyrus.properties.uml.modelelement.StereotypeApplicationModelElement;
+import org.eclipse.papyrus.properties.widgets.AbstractPropertyEditor;
+import org.eclipse.papyrus.properties.widgets.layout.PropertiesLayout;
+import org.eclipse.papyrus.widgets.editors.AbstractEditor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.uml2.uml.Element;
+
+
+public class StereotypeApplication extends AbstractPropertyEditor {
+
+ private AppliedStereotypeCompositeWithView stereotypeComposite;
+
+ private AppliedStereotypePropertyCompositeWithView propertyComposite;
+
+ private Composite self;
+
+ public StereotypeApplication(Composite parent, int style) {
+ self = new Composite(parent, style);
+ self.setLayout(new PropertiesLayout(2, true));
+
+ stereotypeComposite = new AppliedStereotypeCompositeWithView(self);
+ stereotypeComposite.createContent(self, AbstractEditor.factory);
+
+ propertyComposite = new AppliedStereotypePropertyCompositeWithView(self, stereotypeComposite);
+ propertyComposite.createContent(self, AbstractEditor.factory);
+
+ stereotypeComposite.setPropertyComposite(propertyComposite);
+ }
+
+ @Override
+ protected void doBinding() {
+ // No Databinding here ; the AppliedStereotypeCompositeWithView is responsible
+ // for editing the data
+ ModelElement element = input.getModelElement(propertyPath);
+ if(element instanceof StereotypeApplicationModelElement) {
+ View diagramElement = (View)((StereotypeApplicationModelElement)element).getEModelElement();
+ EditPart editPart = ((StereotypeApplicationModelElement)element).getEditPart();
+ Element umlElement = (Element)diagramElement.getElement();
+
+ stereotypeComposite.setSelection(new StructuredSelection(Collections.singletonList(editPart)));
+ stereotypeComposite.setElement(umlElement);
+ stereotypeComposite.setInput(new StereotypedElementTreeObject(umlElement));
+ stereotypeComposite.setDiagramElement(diagramElement);
+
+ stereotypeComposite.refresh();
+ }
+ }
+}

Back to the top