diff options
author | Cedric Notot | 2013-04-02 08:04:17 +0000 |
---|---|---|
committer | Cedric Notot | 2013-04-02 08:04:17 +0000 |
commit | f17507be794ad1bcae541856edc4c2168d4189c7 (patch) | |
tree | cf32c64ad60f924732c59f18baa1ced5980bf3f5 | |
parent | e44d19f5333a9fcde48fe20a739144bb158e8f7d (diff) | |
download | org.eclipse.emf.compare-cno/multiDiag.tar.gz org.eclipse.emf.compare-cno/multiDiag.tar.xz org.eclipse.emf.compare-cno/multiDiag.zip |
GMF Engine : ResourceAttachmentChange managementcno/multiDiag
- No resource control case for GMF
- Multi-diagram case -> DiagramChange ADD/DELETE
26 files changed, 1044 insertions, 170 deletions
diff --git a/plugins/org.eclipse.emf.compare.diagram.edit/icons/full/obj16/DiagramChange.gif b/plugins/org.eclipse.emf.compare.diagram.edit/icons/full/obj16/DiagramChange.gif Binary files differnew file mode 100644 index 000000000..d3dc5a9ad --- /dev/null +++ b/plugins/org.eclipse.emf.compare.diagram.edit/icons/full/obj16/DiagramChange.gif diff --git a/plugins/org.eclipse.emf.compare.diagram.edit/plugin.properties b/plugins/org.eclipse.emf.compare.diagram.edit/plugin.properties index 0d8259b3c..29db58ced 100644 --- a/plugins/org.eclipse.emf.compare.diagram.edit/plugin.properties +++ b/plugins/org.eclipse.emf.compare.diagram.edit/plugin.properties @@ -38,3 +38,4 @@ _UI_DiagramDiff_view_feature = View _UI_Unknown_feature = Unspecified
_UI_CoordinatesChange_type = Coordinates Change
+_UI_DiagramChange_type = Diagram Change
diff --git a/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/DiagramChangeItemProvider.java b/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/DiagramChangeItemProvider.java new file mode 100644 index 000000000..2bd7949ee --- /dev/null +++ b/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/DiagramChangeItemProvider.java @@ -0,0 +1,125 @@ +/**
+ * Copyright (c) 2013 Obeo.
+ * 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:
+ * Obeo - initial API and implementation
+ */
+package org.eclipse.emf.compare.diagram.internal.extensions.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.compare.DifferenceKind;
+
+import org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange;
+
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemColorProvider;
+import org.eclipse.emf.edit.provider.IItemFontProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class DiagramChangeItemProvider
+ extends DiagramDiffItemProvider
+ implements
+ IEditingDomainItemProvider,
+ IStructuredItemContentProvider,
+ ITreeItemContentProvider,
+ IItemLabelProvider,
+ IItemPropertySource,
+ IItemColorProvider,
+ IItemFontProvider {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DiagramChangeItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This returns DiagramChange.gif.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/DiagramChange"));
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ DifferenceKind labelValue = ((DiagramChange)object).getKind();
+ String label = labelValue == null ? null : labelValue.toString();
+ return label == null || label.length() == 0 ?
+ getString("_UI_DiagramChange_type") :
+ getString("_UI_DiagramChange_type") + " " + label;
+ }
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+ }
+
+}
diff --git a/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/DiagramDiffItemProvider.java b/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/DiagramDiffItemProvider.java index dd6012c8f..9b2f10221 100644 --- a/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/DiagramDiffItemProvider.java +++ b/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/DiagramDiffItemProvider.java @@ -31,10 +31,9 @@ import org.eclipse.emf.edit.provider.IStructuredItemContentProvider; import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
/**
- * This is the item provider adapter for a
- * {@link org.eclipse.emf.compare.diagram.internal.extensions.DiagramDiff} object. <!-- begin-user-doc -->
+ * This is the item provider adapter for a {@link org.eclipse.emf.compare.diagram.internal.extensions.DiagramDiff} object.
+ * <!-- begin-user-doc -->
* <!-- end-user-doc -->
- *
* @generated
*/
public class DiagramDiffItemProvider extends DiffItemProvider implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, IItemColorProvider, IItemFontProvider {
@@ -66,51 +65,67 @@ public class DiagramDiffItemProvider extends DiffItemProvider implements IEditin }
/**
- * This adds a property descriptor for the Semantic Diff feature. <!-- begin-user-doc --> <!--
+ * This adds a property descriptor for the Semantic Diff feature.
+ * <!-- begin-user-doc --> <!--
* end-user-doc -->
- *
* @generated
*/
protected void addSemanticDiffPropertyDescriptor(Object object) {
- itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory)
- .getRootAdapterFactory(), getResourceLocator(),
- getString("_UI_DiagramDiff_semanticDiff_feature"), getString(
- "_UI_PropertyDescriptor_description", "_UI_DiagramDiff_semanticDiff_feature",
- "_UI_DiagramDiff_type"), ExtensionsPackage.Literals.DIAGRAM_DIFF__SEMANTIC_DIFF,
- true, false, true, null, null, null));
+ itemPropertyDescriptors.add
+ (createItemPropertyDescriptor
+ (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+ getResourceLocator(),
+ getString("_UI_DiagramDiff_semanticDiff_feature"),
+ getString("_UI_PropertyDescriptor_description", "_UI_DiagramDiff_semanticDiff_feature", "_UI_DiagramDiff_type"),
+ ExtensionsPackage.Literals.DIAGRAM_DIFF__SEMANTIC_DIFF,
+ true,
+ false,
+ true,
+ null,
+ null,
+ null));
}
/**
- * This adds a property descriptor for the View feature. <!-- begin-user-doc --> <!-- end-user-doc -->
- *
+ * This adds a property descriptor for the View feature.
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
protected void addViewPropertyDescriptor(Object object) {
- itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory)
- .getRootAdapterFactory(), getResourceLocator(), getString("_UI_DiagramDiff_view_feature"),
- getString("_UI_PropertyDescriptor_description", "_UI_DiagramDiff_view_feature",
- "_UI_DiagramDiff_type"), ExtensionsPackage.Literals.DIAGRAM_DIFF__VIEW, true, false,
- true, null, null, null));
+ itemPropertyDescriptors.add
+ (createItemPropertyDescriptor
+ (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+ getResourceLocator(),
+ getString("_UI_DiagramDiff_view_feature"),
+ getString("_UI_PropertyDescriptor_description", "_UI_DiagramDiff_view_feature", "_UI_DiagramDiff_type"),
+ ExtensionsPackage.Literals.DIAGRAM_DIFF__VIEW,
+ true,
+ false,
+ true,
+ null,
+ null,
+ null));
}
/**
- * This returns the label text for the adapted class. <!-- begin-user-doc --> <!-- end-user-doc -->
- *
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
public String getText(Object object) {
DifferenceKind labelValue = ((DiagramDiff)object).getKind();
String label = labelValue == null ? null : labelValue.toString();
- return label == null || label.length() == 0 ? getString("_UI_DiagramDiff_type")
- : getString("_UI_DiagramDiff_type") + " " + label;
+ return label == null || label.length() == 0 ?
+ getString("_UI_DiagramDiff_type") :
+ getString("_UI_DiagramDiff_type") + " " + label;
}
/**
- * This handles model notifications by calling {@link #updateChildren} to update any cached children and
- * by creating a viewer notification, which it passes to {@link #fireNotifyChanged}. <!-- begin-user-doc
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc
* --> <!-- end-user-doc -->
- *
* @generated
*/
@Override
@@ -120,9 +135,9 @@ public class DiagramDiffItemProvider extends DiffItemProvider implements IEditin }
/**
- * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children that can be
- * created under this object. <!-- begin-user-doc --> <!-- end-user-doc -->
- *
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc --> <!-- end-user-doc -->
* @generated
*/
@Override
@@ -131,9 +146,9 @@ public class DiagramDiffItemProvider extends DiffItemProvider implements IEditin }
/**
- * Return the resource locator for this item provider's resources. <!-- begin-user-doc --> <!--
+ * Return the resource locator for this item provider's resources.
+ * <!-- begin-user-doc --> <!--
* end-user-doc -->
- *
* @generated
*/
@Override
diff --git a/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/ExtensionsItemProviderAdapterFactory.java b/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/ExtensionsItemProviderAdapterFactory.java index 40dfd0719..f07c7dccf 100644 --- a/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/ExtensionsItemProviderAdapterFactory.java +++ b/plugins/org.eclipse.emf.compare.diagram.edit/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/provider/ExtensionsItemProviderAdapterFactory.java @@ -199,6 +199,29 @@ public class ExtensionsItemProviderAdapterFactory extends ExtensionsAdapterFacto }
/**
+ * This keeps track of the one adapter used for all {@link org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange} instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DiagramChangeItemProvider diagramChangeItemProvider;
+
+ /**
+ * This creates an adapter for a {@link org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter createDiagramChangeAdapter() {
+ if (diagramChangeItemProvider == null) {
+ diagramChangeItemProvider = new DiagramChangeItemProvider(this);
+ }
+
+ return diagramChangeItemProvider;
+ }
+
+ /**
* This returns the root adapter factory that contains this factory.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -302,6 +325,7 @@ public class ExtensionsItemProviderAdapterFactory extends ExtensionsAdapterFacto if (nodeChangeItemProvider != null) nodeChangeItemProvider.dispose();
if (coordinatesChangeItemProvider != null) coordinatesChangeItemProvider.dispose();
if (edgeChangeItemProvider != null) edgeChangeItemProvider.dispose();
+ if (diagramChangeItemProvider != null) diagramChangeItemProvider.dispose();
}
}
diff --git a/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/DiagramChangeItemProviderSpec.java b/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/DiagramChangeItemProviderSpec.java new file mode 100644 index 000000000..69726fb6c --- /dev/null +++ b/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/DiagramChangeItemProviderSpec.java @@ -0,0 +1,91 @@ +/**
+ * Copyright (c) 2013 Obeo.
+ * 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:
+ * Obeo - initial API and implementation
+ */
+package org.eclipse.emf.compare.diagram.internal.extensions.provider.spec;
+
+import com.google.common.collect.Iterators;
+
+import java.util.Collection;
+
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.ResourceAttachmentChange;
+import org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange;
+import org.eclipse.emf.compare.diagram.internal.extensions.DiagramDiff;
+import org.eclipse.emf.compare.diagram.internal.factories.extensions.DiagramChangeFactory;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+
+/**
+ * Item provider for node changes.
+ *
+ * @author <a href="mailto:cedric.notot@obeo.fr">Cedric Notot</a>
+ */
+public class DiagramChangeItemProviderSpec extends ForwardingDiagramDiffItemProvider {
+
+ /**
+ * Constructor.
+ *
+ * @param delegate
+ * The origin item provider adapter.
+ */
+ public DiagramChangeItemProviderSpec(ItemProviderAdapter delegate) {
+ super(delegate);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.compare.diagram.internal.extensions.provider.spec.ForwardingDiagramDiffItemProvider#getReferenceText(org.eclipse.emf.compare.diagram.internal.extensions.DiagramDiff)
+ */
+ @Override
+ protected String getReferenceText(DiagramDiff diagramDiff) {
+ String result = ""; //$NON-NLS-1$
+ Diff diff = null;
+ DifferenceKind kind = diagramDiff.getKind();
+ switch (kind) {
+ case ADD:
+ case DELETE:
+ diff = Iterators.find(diagramDiff.getRefinedBy().iterator(), DiagramChangeFactory
+ .isMainDiffForAddOrDeleteDiagram(), null);
+ break;
+ default:
+ }
+ if (diff instanceof ResourceAttachmentChange) {
+ result = "contents";
+ }
+ return result;
+
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.compare.diagram.internal.extensions.provider.spec.ForwardingDiagramDiffItemProvider#isCandidateToAddChildren(java.lang.Object)
+ */
+ @Override
+ protected boolean isCandidateToAddChildren(Object object) {
+ return object instanceof DiagramChange
+ && (((DiagramChange)object).getKind() == DifferenceKind.ADD || ((DiagramChange)object)
+ .getKind() == DifferenceKind.DELETE);
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see org.eclipse.emf.compare.diagram.internal.extensions.provider.spec.ForwardingDiagramDiffItemProvider#getChildren(java.lang.Object)
+ */
+ @Override
+ public Collection<?> getChildren(Object object) {
+ Collection<?> result = super.getChildren(object);
+ if (isCandidateToAddChildren(object)) {
+ result.remove(object);
+ }
+ return result;
+ }
+}
diff --git a/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/ExtensionsItemProviderAdapterFactorySpec.java b/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/ExtensionsItemProviderAdapterFactorySpec.java index 8cf075799..c2f358240 100644 --- a/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/ExtensionsItemProviderAdapterFactorySpec.java +++ b/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/ExtensionsItemProviderAdapterFactorySpec.java @@ -38,6 +38,9 @@ public class ExtensionsItemProviderAdapterFactorySpec extends ExtensionsItemProv /** Item provider used for the coordinates change. */
CoordinatesChangeItemProviderSpec fCoordinatesChangeItemProvider;
+ /** Item provider used for the diagram change. */
+ DiagramChangeItemProviderSpec fDiagramChangeItemProvider;
+
/**
* Constructor.
*/
@@ -115,4 +118,18 @@ public class ExtensionsItemProviderAdapterFactorySpec extends ExtensionsItemProv }
return fCoordinatesChangeItemProvider;
}
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.compare.diagram.internal.extensions.provider.ExtensionsItemProviderAdapterFactory#createDiagramChangeAdapter()
+ */
+ @Override
+ public Adapter createDiagramChangeAdapter() {
+ if (fDiagramChangeItemProvider == null) {
+ fDiagramChangeItemProvider = new DiagramChangeItemProviderSpec((ItemProviderAdapter)super
+ .createDiagramChangeAdapter());
+ }
+ return fDiagramChangeItemProvider;
+ }
}
diff --git a/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/ForwardingDiagramDiffItemProvider.java b/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/ForwardingDiagramDiffItemProvider.java index 07e94064b..5c609dec0 100644 --- a/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/ForwardingDiagramDiffItemProvider.java +++ b/plugins/org.eclipse.emf.compare.diagram.edit/src/org/eclipse/emf/compare/diagram/internal/extensions/provider/spec/ForwardingDiagramDiffItemProvider.java @@ -88,8 +88,6 @@ public class ForwardingDiagramDiffItemProvider extends ForwardingItemProvider im Comparison comparison = diagramDiff.getMatch().getComparison();
match = comparison.getMatch(view);
ret.addAll(match.getSubmatches());
- }
- if (match != null) {
ITreeItemContentProvider contentProvider = (ITreeItemContentProvider)getRootAdapterFactory()
.adapt(match, ITreeItemContentProvider.class);
if (contentProvider != null) {
diff --git a/plugins/org.eclipse.emf.compare.diagram.ide.ui/src/org/eclipse/emf/compare/diagram/ide/ui/internal/contentmergeviewer/diagram/DiagramContentMergeViewer.java b/plugins/org.eclipse.emf.compare.diagram.ide.ui/src/org/eclipse/emf/compare/diagram/ide/ui/internal/contentmergeviewer/diagram/DiagramContentMergeViewer.java index b9e88ff20..da91b9c62 100644 --- a/plugins/org.eclipse.emf.compare.diagram.ide.ui/src/org/eclipse/emf/compare/diagram/ide/ui/internal/contentmergeviewer/diagram/DiagramContentMergeViewer.java +++ b/plugins/org.eclipse.emf.compare.diagram.ide.ui/src/org/eclipse/emf/compare/diagram/ide/ui/internal/contentmergeviewer/diagram/DiagramContentMergeViewer.java @@ -381,8 +381,11 @@ public class DiagramContentMergeViewer extends EMFCompareContentMergeViewer { decorators = new ArrayList(); } - decorators.add(createAndRegisterDecorator(difference, referenceView, referenceFigure, - targetSide)); + AbstractDecorator decorator = createAndRegisterDecorator(difference, referenceView, + referenceFigure, targetSide); + if (decorator != null) { + decorators.add(decorator); + } } } @@ -542,15 +545,17 @@ public class DiagramContentMergeViewer extends EMFCompareContentMergeViewer { * The reference view. * @param side * The side where the layer has to be found. - * @return The layer figure. + * @return The layer figure or null if the edit part of the diagram is not found. */ protected IFigure getLayer(View referenceView, MergeViewerSide side) { Diagram referenceDiagram = referenceView.getDiagram(); Diagram targetDiagram = (Diagram)getMatchView(referenceDiagram, side); DiagramMergeViewer targetViewer = getViewer(side); - IFigure targetLayer = LayerManager.Helper.find(targetViewer.getEditPart(targetDiagram)).getLayer( - getIDLayer(referenceView)); - return targetLayer; + EditPart editPart = targetViewer.getEditPart(targetDiagram); + if (editPart != null) { + return LayerManager.Helper.find(editPart).getLayer(getIDLayer(referenceView)); + } + return null; } /** @@ -560,7 +565,7 @@ public class DiagramContentMergeViewer extends EMFCompareContentMergeViewer { * * @param referenceView * The reference view. - * @return The ID of te layer. + * @return The ID of the layer. */ protected Object getIDLayer(View referenceView) { if (referenceView instanceof Edge) { @@ -840,7 +845,9 @@ public class DiagramContentMergeViewer extends EMFCompareContentMergeViewer { protected Phantom createAndRegisterDecorator(Diff diff, View referenceView, IFigure referenceFigure, MergeViewerSide targetSide) { Phantom phantom = createPhantom(diff, referenceView, referenceFigure, targetSide); - fPhantomRegistry.put(diff, phantom); + if (phantom != null) { + fPhantomRegistry.put(diff, phantom); + } return phantom; } @@ -964,89 +971,98 @@ public class DiagramContentMergeViewer extends EMFCompareContentMergeViewer { * The reference figure as base for creation of the phantom. * @param side * The side where the phantom has to be created. - * @return The phantom. + * @return The phantom or null if the target layer is not found. */ private Phantom createPhantom(Diff diff, View referenceView, IFigure referenceFigure, MergeViewerSide side) { - MergeViewerSide referenceSide = getSide(referenceView); + IFigure targetLayer = getLayer(referenceView, side); + if (targetLayer != null) { + MergeViewerSide referenceSide = getSide(referenceView); - Rectangle rect = referenceFigure.getBounds().getCopy(); + Rectangle rect = referenceFigure.getBounds().getCopy(); - IFigure referenceLayer = getLayer(referenceView, referenceSide); - translateCoordinates(referenceFigure, referenceLayer, rect); + IFigure referenceLayer = getLayer(referenceView, referenceSide); + translateCoordinates(referenceFigure, referenceLayer, rect); - DecoratorFigure ghost = null; + DecoratorFigure ghost = null; - IFigure targetLayer = getLayer(referenceView, side); - Phantom phantom = new Phantom(targetLayer, side, referenceView, referenceFigure, diff); - - // Container "list" case - if (isNodeList(referenceView)) { - Diff refiningDiff = Iterators.find(diff.getRefinedBy().iterator(), and( - valueIs(referenceView), onFeature(NotationPackage.Literals.VIEW__PERSISTED_CHILDREN - .getName()))); - - // FIXME: It has to manage visible views. - int index = DiffUtil.findInsertionIndex(getComparison(), refiningDiff, - side == MergeViewerSide.LEFT); - - IFigure referenceParentFigure = referenceFigure.getParent(); - Rectangle referenceParentBounds = referenceParentFigure.getBounds().getCopy(); - translateCoordinates(referenceParentFigure, referenceLayer, referenceParentBounds); - - View parentView = (View)getMatchView(referenceView.eContainer(), side); - if (parentView != null) { - int nbElements = getVisibleViews(parentView).size(); - if (index > nbElements) { - index = nbElements; - } - } + Phantom phantom = new Phantom(targetLayer, side, referenceView, referenceFigure, diff); + + // Container "list" case + if (isNodeList(referenceView)) { + Diff refiningDiff = Iterators.find(diff.getRefinedBy().iterator(), and( + valueIs(referenceView), + onFeature(NotationPackage.Literals.VIEW__PERSISTED_CHILDREN.getName()))); - // FIXME: The add of decorators modifies the physical coordinates of elements - // FIXME: Compute position from the y position of the first child + sum of height of the - // children. - int pos = rect.height * index + referenceParentBounds.y + 1; - Map<String, Object> parameters = new HashMap<String, Object>(); - parameters.put(NodeListFigure.PARAM_Y_POS, Integer.valueOf(pos)); - - ghost = new NodeListFigure(diff, isThreeWay(), getCompareColor(), referenceFigure, rect, - true, parameters); - - // Edge case - } else if (referenceView instanceof Edge) { - // If the edge phantom ties shapes where their coordinates changed - if (hasAnExtremityChange((Edge)referenceView, side)) { - EditPart edgeEditPart = createEdgeEditPart((Edge)referenceView, referenceSide, side); - if (edgeEditPart instanceof GraphicalEditPart) { - phantom.setEditPart(edgeEditPart); - - IFigure fig = ((GraphicalEditPart)edgeEditPart).getFigure(); - fig.getChildren().clear(); - ghost = new DecoratorFigure(diff, isThreeWay(), getCompareColor(), referenceFigure, - fig, true); + // FIXME: It has to manage visible views. + int index = DiffUtil.findInsertionIndex(getComparison(), refiningDiff, + side == MergeViewerSide.LEFT); + IFigure referenceParentFigure = referenceFigure.getParent(); + Rectangle referenceParentBounds = referenceParentFigure.getBounds().getCopy(); + translateCoordinates(referenceParentFigure, referenceLayer, referenceParentBounds); + + View parentView = (View)getMatchView(referenceView.eContainer(), side); + if (parentView != null) { + int nbElements = getVisibleViews(parentView).size(); + // CHECKSTYLE:OFF + if (index > nbElements) { + // CHECKSTYLE:ON + index = nbElements; + } } - // Else, it creates only a polyline connection figure with the same properties as the - // reference - } else { - if (referenceFigure instanceof PolylineConnection) { - ghost = new EdgeFigure(diff, isThreeWay(), getCompareColor(), referenceFigure, rect, - true); + + // FIXME: The add of decorators modifies the physical coordinates of elements + // FIXME: Compute position from the y position of the first child + sum of height of the + // children. + int pos = rect.height * index + referenceParentBounds.y + 1; + Map<String, Object> parameters = new HashMap<String, Object>(); + parameters.put(NodeListFigure.PARAM_Y_POS, Integer.valueOf(pos)); + + ghost = new NodeListFigure(diff, isThreeWay(), getCompareColor(), referenceFigure, rect, + true, parameters); + + // Edge case + } else if (referenceView instanceof Edge) { + // If the edge phantom ties shapes where their coordinates changed + if (hasAnExtremityChange((Edge)referenceView, side)) { + EditPart edgeEditPart = createEdgeEditPart((Edge)referenceView, referenceSide, side); + // CHECKSTYLE:OFF + if (edgeEditPart instanceof GraphicalEditPart) { + // CHECKSTYLE:ON + phantom.setEditPart(edgeEditPart); + + IFigure fig = ((GraphicalEditPart)edgeEditPart).getFigure(); + fig.getChildren().clear(); + ghost = new DecoratorFigure(diff, isThreeWay(), getCompareColor(), + referenceFigure, fig, true); + + } + // Else, it creates only a polyline connection figure with the same properties as the + // reference + } else { + if (referenceFigure instanceof PolylineConnection) { + ghost = new EdgeFigure(diff, isThreeWay(), getCompareColor(), referenceFigure, + rect, true); + } } } - } - // Default case: Nodes - if (ghost == null) { - ghost = new NodeFigure(diff, isThreeWay(), getCompareColor(), referenceFigure, rect, true); - } + // Default case: Nodes + if (ghost == null) { + ghost = new NodeFigure(diff, isThreeWay(), getCompareColor(), referenceFigure, rect, true); + } - phantom.setDecoratorFigure(ghost); + phantom.setDecoratorFigure(ghost); - translateWhenInsideContainerChange(phantom); + translateWhenInsideContainerChange(phantom); + + return phantom; + } + + return null; - return phantom; } /** @@ -1420,12 +1436,14 @@ public class DiagramContentMergeViewer extends EMFCompareContentMergeViewer { protected Marker createAndRegisterDecorator(Diff diff, View referenceView, IFigure referenceFigure, MergeViewerSide targetSide) { Marker marker = createMarker(diff, referenceView, referenceFigure, targetSide); - List<Marker> markers = fMarkerRegistry.get(diff); - if (markers == null) { - markers = new ArrayList<Marker>(); - fMarkerRegistry.put(diff, markers); + if (marker != null) { + List<Marker> markers = fMarkerRegistry.get(diff); + if (markers == null) { + markers = new ArrayList<Marker>(); + fMarkerRegistry.put(diff, markers); + } + markers.add(marker); } - markers.add(marker); return marker; } @@ -1496,44 +1514,47 @@ public class DiagramContentMergeViewer extends EMFCompareContentMergeViewer { * The reference figure as base for creation of the marker. * @param side * The side where the marker has to be created. - * @return The phantom. + * @return The phantom or null if the target layer is not found. */ private Marker createMarker(Diff diff, View referenceView, IFigure referenceFigure, MergeViewerSide side) { - Rectangle referenceBounds = referenceFigure.getBounds().getCopy(); IFigure referenceLayer = getLayer(referenceView, side); - translateCoordinates(referenceFigure, referenceLayer, referenceBounds); + if (referenceLayer != null) { + Rectangle referenceBounds = referenceFigure.getBounds().getCopy(); + translateCoordinates(referenceFigure, referenceLayer, referenceBounds); - DecoratorFigure markerFigure = null; + DecoratorFigure markerFigure = null; - IFigure targetLayer = getLayer(referenceView, side); - Marker marker = new Marker(targetLayer, side, referenceView, referenceFigure, diff); + Marker marker = new Marker(referenceLayer, side, referenceView, referenceFigure, diff); - if (isNodeList(referenceView)) { + if (isNodeList(referenceView)) { - markerFigure = new NodeListFigure(diff, isThreeWay(), getCompareColor(), referenceFigure, - referenceBounds, false); + markerFigure = new NodeListFigure(diff, isThreeWay(), getCompareColor(), referenceFigure, + referenceBounds, false); - } else if (referenceView instanceof Edge) { + } else if (referenceView instanceof Edge) { + + if (referenceFigure instanceof PolylineConnection) { + markerFigure = new EdgeFigure(diff, isThreeWay(), getCompareColor(), referenceFigure, + referenceBounds, false); + } - if (referenceFigure instanceof PolylineConnection) { - markerFigure = new EdgeFigure(diff, isThreeWay(), getCompareColor(), referenceFigure, - referenceBounds, false); } - } + // Default case: Nodes + if (markerFigure == null) { - // Default case: Nodes - if (markerFigure == null) { + markerFigure = new NodeFigure(diff, isThreeWay(), getCompareColor(), referenceFigure, + referenceBounds, false); + } - markerFigure = new NodeFigure(diff, isThreeWay(), getCompareColor(), referenceFigure, - referenceBounds, false); + marker.setDecoratorFigure(markerFigure); + return marker; } - marker.setDecoratorFigure(markerFigure); + return null; - return marker; } /** diff --git a/plugins/org.eclipse.emf.compare.diagram/model/diagramCompare.ecore b/plugins/org.eclipse.emf.compare.diagram/model/diagramCompare.ecore index bb9b74f66..58873b48f 100644 --- a/plugins/org.eclipse.emf.compare.diagram/model/diagramCompare.ecore +++ b/plugins/org.eclipse.emf.compare.diagram/model/diagramCompare.ecore @@ -11,4 +11,5 @@ <eStructuralFeatures xsi:type="ecore:EReference" name="semanticDiff" eType="ecore:EClass ../../org.eclipse.emf.compare/model/compare.ecore#//Diff"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="view" eType="ecore:EClass platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EObject"/>
</eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DiagramChange" eSuperTypes="#//DiagramDiff"/>
</ecore:EPackage>
diff --git a/plugins/org.eclipse.emf.compare.diagram/model/diagramCompare.genmodel b/plugins/org.eclipse.emf.compare.diagram/model/diagramCompare.genmodel index b29c5635e..e1cf1b06e 100644 --- a/plugins/org.eclipse.emf.compare.diagram/model/diagramCompare.genmodel +++ b/plugins/org.eclipse.emf.compare.diagram/model/diagramCompare.genmodel @@ -17,5 +17,6 @@ <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference diagramCompare.ecore#//DiagramDiff/semanticDiff"/>
<genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference diagramCompare.ecore#//DiagramDiff/view"/>
</genClasses>
+ <genClasses ecoreClass="diagramCompare.ecore#//DiagramChange"/>
</genPackages>
</genmodel:GenModel>
diff --git a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/DiagramChange.java b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/DiagramChange.java new file mode 100644 index 000000000..382313dd9 --- /dev/null +++ b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/DiagramChange.java @@ -0,0 +1,25 @@ +/**
+ * Copyright (c) 2013 Obeo.
+ * 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:
+ * Obeo - initial API and implementation
+ */
+package org.eclipse.emf.compare.diagram.internal.extensions;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Diagram Change</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.emf.compare.diagram.internal.extensions.ExtensionsPackage#getDiagramChange()
+ * @model
+ * @generated
+ */
+public interface DiagramChange extends DiagramDiff {
+} // DiagramChange
diff --git a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/ExtensionsFactory.java b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/ExtensionsFactory.java index 884a1abd5..d2f637fa8 100644 --- a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/ExtensionsFactory.java +++ b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/ExtensionsFactory.java @@ -75,6 +75,15 @@ public interface ExtensionsFactory extends EFactory { EdgeChange createEdgeChange();
/**
+ * Returns a new object of class '<em>Diagram Change</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Diagram Change</em>'.
+ * @generated
+ */
+ DiagramChange createDiagramChange();
+
+ /**
* Returns the package supported by this factory.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/ExtensionsPackage.java b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/ExtensionsPackage.java index 659c058e2..da8ed845e 100644 --- a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/ExtensionsPackage.java +++ b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/ExtensionsPackage.java @@ -828,6 +828,134 @@ public interface ExtensionsPackage extends EPackage { /**
+ * The meta object id for the '{@link org.eclipse.emf.compare.diagram.internal.extensions.impl.DiagramChangeImpl <em>Diagram Change</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.emf.compare.diagram.internal.extensions.impl.DiagramChangeImpl
+ * @see org.eclipse.emf.compare.diagram.internal.extensions.impl.ExtensionsPackageImpl#getDiagramChange()
+ * @generated
+ */
+ int DIAGRAM_CHANGE = 6;
+
+ /**
+ * The feature id for the '<em><b>Match</b></em>' container reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DIAGRAM_CHANGE__MATCH = DIAGRAM_DIFF__MATCH;
+
+ /**
+ * The feature id for the '<em><b>Requires</b></em>' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DIAGRAM_CHANGE__REQUIRES = DIAGRAM_DIFF__REQUIRES;
+
+ /**
+ * The feature id for the '<em><b>Required By</b></em>' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DIAGRAM_CHANGE__REQUIRED_BY = DIAGRAM_DIFF__REQUIRED_BY;
+
+ /**
+ * The feature id for the '<em><b>Refines</b></em>' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DIAGRAM_CHANGE__REFINES = DIAGRAM_DIFF__REFINES;
+
+ /**
+ * The feature id for the '<em><b>Refined By</b></em>' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DIAGRAM_CHANGE__REFINED_BY = DIAGRAM_DIFF__REFINED_BY;
+
+ /**
+ * The feature id for the '<em><b>Kind</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DIAGRAM_CHANGE__KIND = DIAGRAM_DIFF__KIND;
+
+ /**
+ * The feature id for the '<em><b>Source</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DIAGRAM_CHANGE__SOURCE = DIAGRAM_DIFF__SOURCE;
+
+ /**
+ * The feature id for the '<em><b>State</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DIAGRAM_CHANGE__STATE = DIAGRAM_DIFF__STATE;
+
+ /**
+ * The feature id for the '<em><b>Equivalence</b></em>' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DIAGRAM_CHANGE__EQUIVALENCE = DIAGRAM_DIFF__EQUIVALENCE;
+
+ /**
+ * The feature id for the '<em><b>Conflict</b></em>' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DIAGRAM_CHANGE__CONFLICT = DIAGRAM_DIFF__CONFLICT;
+
+ /**
+ * The feature id for the '<em><b>Semantic Diff</b></em>' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DIAGRAM_CHANGE__SEMANTIC_DIFF = DIAGRAM_DIFF__SEMANTIC_DIFF;
+
+ /**
+ * The feature id for the '<em><b>View</b></em>' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DIAGRAM_CHANGE__VIEW = DIAGRAM_DIFF__VIEW;
+
+ /**
+ * The number of structural features of the '<em>Diagram Change</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DIAGRAM_CHANGE_FEATURE_COUNT = DIAGRAM_DIFF_FEATURE_COUNT + 0;
+
+
+ /**
* Returns the meta object for class '{@link org.eclipse.emf.compare.diagram.internal.extensions.Show <em>Show</em>}'.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -910,6 +1038,16 @@ public interface ExtensionsPackage extends EPackage { EReference getDiagramDiff_View();
/**
+ * Returns the meta object for class '{@link org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange <em>Diagram Change</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Diagram Change</em>'.
+ * @see org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange
+ * @generated
+ */
+ EClass getDiagramChange();
+
+ /**
* Returns the factory that creates the instances of the model.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -1007,6 +1145,16 @@ public interface ExtensionsPackage extends EPackage { */
EReference DIAGRAM_DIFF__VIEW = eINSTANCE.getDiagramDiff_View();
+ /**
+ * The meta object literal for the '{@link org.eclipse.emf.compare.diagram.internal.extensions.impl.DiagramChangeImpl <em>Diagram Change</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.emf.compare.diagram.internal.extensions.impl.DiagramChangeImpl
+ * @see org.eclipse.emf.compare.diagram.internal.extensions.impl.ExtensionsPackageImpl#getDiagramChange()
+ * @generated
+ */
+ EClass DIAGRAM_CHANGE = eINSTANCE.getDiagramChange();
+
}
} //ExtensionsPackage
diff --git a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/DiagramChangeImpl.java b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/DiagramChangeImpl.java new file mode 100644 index 000000000..123b5e939 --- /dev/null +++ b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/DiagramChangeImpl.java @@ -0,0 +1,47 @@ +/**
+ * Copyright (c) 2013 Obeo.
+ * 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:
+ * Obeo - initial API and implementation
+ */
+package org.eclipse.emf.compare.diagram.internal.extensions.impl;
+
+import org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange;
+import org.eclipse.emf.compare.diagram.internal.extensions.ExtensionsPackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Diagram Change</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * </p>
+ *
+ * @generated
+ */
+public class DiagramChangeImpl extends DiagramDiffImpl implements DiagramChange {
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DiagramChangeImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return ExtensionsPackage.Literals.DIAGRAM_CHANGE;
+ }
+
+} //DiagramChangeImpl
diff --git a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/ExtensionsFactoryImpl.java b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/ExtensionsFactoryImpl.java index 609ff8851..1272455c8 100644 --- a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/ExtensionsFactoryImpl.java +++ b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/ExtensionsFactoryImpl.java @@ -69,6 +69,7 @@ public class ExtensionsFactoryImpl extends EFactoryImpl implements ExtensionsFac case ExtensionsPackage.NODE_CHANGE: return createNodeChange();
case ExtensionsPackage.COORDINATES_CHANGE: return createCoordinatesChange();
case ExtensionsPackage.EDGE_CHANGE: return createEdgeChange();
+ case ExtensionsPackage.DIAGRAM_CHANGE: return createDiagramChange();
default:
throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
}
@@ -129,6 +130,16 @@ public class ExtensionsFactoryImpl extends EFactoryImpl implements ExtensionsFac * <!-- end-user-doc -->
* @generated
*/
+ public DiagramChange createDiagramChange() {
+ DiagramChangeImpl diagramChange = new DiagramChangeImpl();
+ return diagramChange;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
public ExtensionsPackage getExtensionsPackage() {
return (ExtensionsPackage)getEPackage();
}
diff --git a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/ExtensionsPackageImpl.java b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/ExtensionsPackageImpl.java index 93848212f..f7ffa7158 100644 --- a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/ExtensionsPackageImpl.java +++ b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/impl/ExtensionsPackageImpl.java @@ -13,6 +13,7 @@ package org.eclipse.emf.compare.diagram.internal.extensions.impl; import org.eclipse.emf.compare.ComparePackage;
import org.eclipse.emf.compare.diagram.internal.extensions.CoordinatesChange;
+import org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange;
import org.eclipse.emf.compare.diagram.internal.extensions.DiagramDiff;
import org.eclipse.emf.compare.diagram.internal.extensions.EdgeChange;
import org.eclipse.emf.compare.diagram.internal.extensions.ExtensionsFactory;
@@ -78,6 +79,13 @@ public class ExtensionsPackageImpl extends EPackageImpl implements ExtensionsPac private EClass diagramDiffEClass = null;
/**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass diagramChangeEClass = null;
+
+ /**
* Creates an instance of the model <b>Package</b>, registered with
* {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
* package URI value.
@@ -218,6 +226,15 @@ public class ExtensionsPackageImpl extends EPackageImpl implements ExtensionsPac * <!-- end-user-doc -->
* @generated
*/
+ public EClass getDiagramChange() {
+ return diagramChangeEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
public ExtensionsFactory getExtensionsFactory() {
return (ExtensionsFactory)getEFactoryInstance();
}
@@ -254,6 +271,8 @@ public class ExtensionsPackageImpl extends EPackageImpl implements ExtensionsPac diagramDiffEClass = createEClass(DIAGRAM_DIFF);
createEReference(diagramDiffEClass, DIAGRAM_DIFF__SEMANTIC_DIFF);
createEReference(diagramDiffEClass, DIAGRAM_DIFF__VIEW);
+
+ diagramChangeEClass = createEClass(DIAGRAM_CHANGE);
}
/**
@@ -294,6 +313,7 @@ public class ExtensionsPackageImpl extends EPackageImpl implements ExtensionsPac coordinatesChangeEClass.getESuperTypes().add(this.getNodeChange());
edgeChangeEClass.getESuperTypes().add(this.getDiagramDiff());
diagramDiffEClass.getESuperTypes().add(theComparePackage.getDiff());
+ diagramChangeEClass.getESuperTypes().add(this.getDiagramDiff());
// Initialize classes and features; add operations and parameters
initEClass(showEClass, Show.class, "Show", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
@@ -310,6 +330,8 @@ public class ExtensionsPackageImpl extends EPackageImpl implements ExtensionsPac initEReference(getDiagramDiff_SemanticDiff(), theComparePackage.getDiff(), null, "semanticDiff", null, 0, 1, DiagramDiff.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
initEReference(getDiagramDiff_View(), theEcorePackage.getEObject(), null, "view", null, 0, 1, DiagramDiff.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEClass(diagramChangeEClass, DiagramChange.class, "DiagramChange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
// Create resource
createResource(eNS_URI);
}
diff --git a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/util/ExtensionsAdapterFactory.java b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/util/ExtensionsAdapterFactory.java index b8335f68f..9e53bda70 100644 --- a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/util/ExtensionsAdapterFactory.java +++ b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/util/ExtensionsAdapterFactory.java @@ -102,6 +102,10 @@ public class ExtensionsAdapterFactory extends AdapterFactoryImpl { return createDiagramDiffAdapter();
}
@Override
+ public Adapter caseDiagramChange(DiagramChange object) {
+ return createDiagramChangeAdapter();
+ }
+ @Override
public Adapter caseDiff(Diff object) {
return createDiffAdapter();
}
@@ -210,6 +214,20 @@ public class ExtensionsAdapterFactory extends AdapterFactoryImpl { }
/**
+ * Creates a new adapter for an object of class '{@link org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange <em>Diagram Change</em>}'.
+ * <!-- begin-user-doc -->
+ * This default implementation returns null so that we can easily ignore cases;
+ * it's useful to ignore a case when inheritance will catch all the cases anyway.
+ * <!-- end-user-doc -->
+ * @return the new adapter.
+ * @see org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange
+ * @generated
+ */
+ public Adapter createDiagramChangeAdapter() {
+ return null;
+ }
+
+ /**
* Creates a new adapter for an object of class '{@link org.eclipse.emf.compare.Diff <em>Diff</em>}'.
* <!-- begin-user-doc -->
* This default implementation returns null so that we can easily ignore cases;
diff --git a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/util/ExtensionsSwitch.java b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/util/ExtensionsSwitch.java index c30e09664..28a6f9c9b 100644 --- a/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/util/ExtensionsSwitch.java +++ b/plugins/org.eclipse.emf.compare.diagram/src-gen/org/eclipse/emf/compare/diagram/internal/extensions/util/ExtensionsSwitch.java @@ -124,6 +124,14 @@ public class ExtensionsSwitch<T> extends Switch<T> { if (result == null) result = defaultCase(theEObject);
return result;
}
+ case ExtensionsPackage.DIAGRAM_CHANGE: {
+ DiagramChange diagramChange = (DiagramChange)theEObject;
+ T result = caseDiagramChange(diagramChange);
+ if (result == null) result = caseDiagramDiff(diagramChange);
+ if (result == null) result = caseDiff(diagramChange);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
default: return defaultCase(theEObject);
}
}
@@ -219,6 +227,21 @@ public class ExtensionsSwitch<T> extends Switch<T> { }
/**
+ * Returns the result of interpreting the object as an instance of '<em>Diagram Change</em>'.
+ * <!-- begin-user-doc -->
+ * This implementation returns null;
+ * returning a non-null result will terminate the switch.
+ * <!-- end-user-doc -->
+ * @param object the target of the switch.
+ * @return the result of interpreting the object as an instance of '<em>Diagram Change</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDiagramChange(DiagramChange object) {
+ return null;
+ }
+
+ /**
* Returns the result of interpreting the object as an instance of '<em>Diff</em>'.
* <!-- begin-user-doc -->
* This implementation returns null;
diff --git a/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/AbstractDiagramChangeFactory.java b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/AbstractDiagramChangeFactory.java index da65053ff..7d3426519 100644 --- a/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/AbstractDiagramChangeFactory.java +++ b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/AbstractDiagramChangeFactory.java @@ -22,6 +22,7 @@ import org.eclipse.emf.compare.Match; import org.eclipse.emf.compare.ReferenceChange; import org.eclipse.emf.compare.diagram.internal.extensions.DiagramDiff; import org.eclipse.emf.compare.internal.postprocessor.factories.AbstractChangeFactory; +import org.eclipse.emf.compare.util.CompareSwitch; import org.eclipse.emf.compare.utils.MatchUtil; import org.eclipse.emf.compare.utils.ReferenceUtil; import org.eclipse.emf.ecore.EObject; @@ -60,18 +61,35 @@ public abstract class AbstractDiagramChangeFactory extends AbstractChangeFactory * @return The view. */ public EObject setView(DiagramDiff extension, Diff refiningDiff) { - EObject view = null; - if (refiningDiff instanceof ReferenceChange) { - view = ((ReferenceChange)refiningDiff).getValue(); - } else if (refiningDiff instanceof AttributeChange) { - Comparison comparison = refiningDiff.getMatch().getComparison(); - view = MatchUtil.getContainer(comparison, refiningDiff); - while (view != null && !(view instanceof View)) { - view = view.eContainer(); + + CompareSwitch<EObject> getterValue = new CompareSwitch<EObject>() { + + @Override + public EObject caseReferenceChange(ReferenceChange object) { + return object.getValue(); } - } + + @Override + public EObject caseAttributeChange(AttributeChange object) { + Comparison comparison = object.getMatch().getComparison(); + EObject view = MatchUtil.getContainer(comparison, object); + while (view != null && !(view instanceof View)) { + view = view.eContainer(); + } + return view; + } + + @Override + public EObject caseResourceAttachmentChange( + org.eclipse.emf.compare.ResourceAttachmentChange object) { + Comparison comparison = object.getMatch().getComparison(); + return MatchUtil.getContainer(comparison, object); + } + + }; + + EObject view = getterValue.doSwitch(refiningDiff); extension.setView(view); - // FIXME: ResourceAttachmentChange ? return view; } diff --git a/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/DiagramExtensionFactoryRegistry.java b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/DiagramExtensionFactoryRegistry.java index f524849f0..e93f0cabb 100644 --- a/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/DiagramExtensionFactoryRegistry.java +++ b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/DiagramExtensionFactoryRegistry.java @@ -19,6 +19,7 @@ import java.util.Map; import org.eclipse.emf.compare.Diff; import org.eclipse.emf.compare.diagram.internal.CompareDiagramConfiguration; import org.eclipse.emf.compare.diagram.internal.factories.extensions.CoordinatesChangeFactory; +import org.eclipse.emf.compare.diagram.internal.factories.extensions.DiagramChangeFactory; import org.eclipse.emf.compare.diagram.internal.factories.extensions.EdgeChangeFactory; import org.eclipse.emf.compare.diagram.internal.factories.extensions.HideFactory; import org.eclipse.emf.compare.diagram.internal.factories.extensions.NodeChangeFactory; @@ -56,6 +57,7 @@ public final class DiagramExtensionFactoryRegistry { factories.add(new NodeChangeFactory()); factories.add(new CoordinatesChangeFactory(configuration)); factories.add(new EdgeChangeFactory()); + factories.add(new DiagramChangeFactory()); for (IChangeFactory iDiffExtensionFactory : factories) { dataset.put(iDiffExtensionFactory.getExtensionKind(), iDiffExtensionFactory); diff --git a/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/extensions/DiagramChangeFactory.java b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/extensions/DiagramChangeFactory.java new file mode 100644 index 000000000..d7e8799da --- /dev/null +++ b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/extensions/DiagramChangeFactory.java @@ -0,0 +1,156 @@ +/*******************************************************************************
+ * Copyright (c) 2013 Obeo.
+ * 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:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.diagram.internal.factories.extensions;
+
+import com.google.common.base.Predicate;
+
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.ResourceAttachmentChange;
+import org.eclipse.emf.compare.diagram.internal.extensions.DiagramChange;
+import org.eclipse.emf.compare.diagram.internal.extensions.DiagramDiff;
+import org.eclipse.emf.compare.diagram.internal.extensions.ExtensionsFactory;
+import org.eclipse.emf.compare.diagram.internal.factories.AbstractDiagramChangeFactory;
+import org.eclipse.emf.compare.utils.MatchUtil;
+import org.eclipse.emf.compare.utils.ReferenceUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+
+/**
+ * Factory of diagram changes.
+ *
+ * @author <a href="mailto:cedric.notot@obeo.fr">Cedric Notot</a>
+ */
+public class DiagramChangeFactory extends AbstractDiagramChangeFactory {
+
+ /**
+ * Constructor.
+ */
+ public DiagramChangeFactory() {
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.compare.internal.postprocessor.factories.AbstractChangeFactory#getExtensionKind()
+ */
+ @Override
+ public Class<? extends Diff> getExtensionKind() {
+ return DiagramChange.class;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.compare.internal.postprocessor.factories.AbstractChangeFactory#createExtension()
+ */
+ @Override
+ public DiagramDiff createExtension() {
+ return ExtensionsFactory.eINSTANCE.createDiagramChange();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.compare.internal.postprocessor.factories.AbstractChangeFactory#setRefiningChanges(org.eclipse.emf.compare.diagram.internal.extensions.DiagramDiff,
+ * org.eclipse.emf.compare.DifferenceKind, org.eclipse.emf.compare.Diff)
+ */
+ @Override
+ public void setRefiningChanges(Diff extension, DifferenceKind extensionKind, Diff refiningDiff) {
+ // Macroscopic change on a diagram is refined by the unit main change and all unit children related
+ // changes.
+ extension.getRefinedBy().add(refiningDiff);
+ extension.getRefinedBy().addAll(getAllContainedDifferences(refiningDiff));
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see org.eclipse.emf.compare.internal.postprocessor.factories.AbstractChangeFactory#fillRequiredDifferences(org.eclipse.emf.compare.Comparison, org.eclipse.emf.compare.Diff)
+ */
+ @Override
+ public void fillRequiredDifferences(Comparison comparison, Diff extension) {
+ // nothing
+ }
+
+ /**
+ * Predicate to check that the given difference is the main unit difference for this macroscopic add or
+ * delete of diagram.
+ *
+ * @return The predicate.
+ */
+ public static Predicate<Diff> isMainDiffForAddOrDeleteDiagram() {
+ return new Predicate<Diff>() {
+ public boolean apply(Diff difference) {
+ return difference instanceof ResourceAttachmentChange
+ && (isRelatedToAnAddDiagram((ResourceAttachmentChange)difference) || isRelatedToADeleteDiagram((ResourceAttachmentChange)difference));
+ }
+ };
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.compare.internal.postprocessor.factories.AbstractChangeFactory#isRelatedToAnExtensionAdd(org.eclipse.emf.compare.ResourceAttachmentChange)
+ */
+ @Override
+ protected boolean isRelatedToAnExtensionAdd(ResourceAttachmentChange input) {
+ return isRelatedToAnAddDiagram(input);
+ }
+
+ /**
+ * It checks that the given resource attachment change concerns the add of a diagram.
+ *
+ * @param input
+ * The reference change.
+ * @return True if it concerns the add of a node, False otherwise.
+ */
+ protected static boolean isRelatedToAnAddDiagram(ResourceAttachmentChange input) {
+ return isContainmentOnSemanticDiagram(input) && input.getKind() == DifferenceKind.ADD;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.compare.internal.postprocessor.factories.AbstractChangeFactory#isRelatedToAnExtensionDelete(org.eclipse.emf.compare.ResourceAttachmentChange)
+ */
+ @Override
+ protected boolean isRelatedToAnExtensionDelete(ResourceAttachmentChange input) {
+ return isRelatedToADeleteDiagram(input);
+ }
+
+ /**
+ * It checks that the given resource attachment change concerns the delete of a diagram.
+ *
+ * @param input
+ * The reference change.
+ * @return True if it concerns the delete of a node, False otherwise.
+ */
+ protected static boolean isRelatedToADeleteDiagram(ResourceAttachmentChange input) {
+ return isContainmentOnSemanticDiagram(input) && input.getKind() == DifferenceKind.DELETE;
+ }
+
+ /**
+ * It checks that the given difference is on a containment link to a Diagram attached to a semantic
+ * object.
+ *
+ * @param input
+ * The difference.
+ * @return True if the difference matches with the predicate.
+ */
+ private static boolean isContainmentOnSemanticDiagram(ResourceAttachmentChange input) {
+ EObject value = MatchUtil.getContainer(input.getMatch().getComparison(), input);
+ return value instanceof Diagram
+ && ReferenceUtil.safeEGet(value, NotationPackage.Literals.VIEW__ELEMENT) != null;
+ }
+
+}
diff --git a/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/extensions/NodeChangeFactory.java b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/extensions/NodeChangeFactory.java index 8b5187cce..4f3910c58 100644 --- a/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/extensions/NodeChangeFactory.java +++ b/plugins/org.eclipse.emf.compare.diagram/src/org/eclipse/emf/compare/diagram/internal/factories/extensions/NodeChangeFactory.java @@ -69,9 +69,7 @@ public class NodeChangeFactory extends AbstractDiagramChangeFactory { // Macroscopic change on a node is refined by the unit main change and unit children related changes.
extension.getRefinedBy().add(refiningDiff);
if (extensionKind != DifferenceKind.MOVE) {
- if (refiningDiff instanceof ReferenceChange) {
- extension.getRefinedBy().addAll(getAllContainedDifferences((ReferenceChange)refiningDiff));
- }
+ extension.getRefinedBy().addAll(getAllContainedDifferences(refiningDiff));
}
}
diff --git a/plugins/org.eclipse.emf.compare.edit/src/org/eclipse/emf/compare/provider/spec/MatchResourceItemProviderSpec.java b/plugins/org.eclipse.emf.compare.edit/src/org/eclipse/emf/compare/provider/spec/MatchResourceItemProviderSpec.java index 79643b0a0..c0adf72de 100644 --- a/plugins/org.eclipse.emf.compare.edit/src/org/eclipse/emf/compare/provider/spec/MatchResourceItemProviderSpec.java +++ b/plugins/org.eclipse.emf.compare.edit/src/org/eclipse/emf/compare/provider/spec/MatchResourceItemProviderSpec.java @@ -10,13 +10,18 @@ *******************************************************************************/ package org.eclipse.emf.compare.provider.spec; -import static com.google.common.collect.Iterables.filter; +import static com.google.common.base.Predicates.not; + +import com.google.common.base.Predicate; +import com.google.common.collect.Collections2; +import com.google.common.collect.Iterators; import java.util.ArrayList; import java.util.Collection; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.compare.Comparison; +import org.eclipse.emf.compare.Diff; import org.eclipse.emf.compare.MatchResource; import org.eclipse.emf.compare.ResourceAttachmentChange; import org.eclipse.emf.compare.provider.IItemDescriptionProvider; @@ -45,25 +50,77 @@ public class MatchResourceItemProviderSpec extends MatchResourceItemProvider imp super(adapterFactory); } + /** + * {@inheritDoc} + * + * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object) + */ @Override public Collection<?> getChildren(Object object) { Collection<Object> children = new ArrayList<Object>(); MatchResource matchResource = (MatchResource)object; Comparison comparison = matchResource.getComparison(); - for (ResourceAttachmentChange rac : filter(comparison.getDifferences(), - ResourceAttachmentChange.class)) { - final String diffResourceURI = rac.getResourceURI(); - if (diffResourceURI != null - && (diffResourceURI.equals(matchResource.getLeftURI()) - || diffResourceURI.equals(matchResource.getRightURI()) || diffResourceURI - .equals(matchResource.getOriginURI()))) { - children.add(rac); - } + for (Diff diff : Collections2.filter(comparison.getDifferences(), isCandidate(matchResource))) { + children.add(diff); } return children; } /** + * Predicate to check that the current difference is candidate to be added under the given + * <code>MatchResource</code>. + * + * @param matchResource + * The match resource. + * @return The predicate. + */ + private Predicate<Diff> isCandidate(final MatchResource matchResource) { + return new Predicate<Diff>() { + public boolean apply(Diff input) { + if (input instanceof ResourceAttachmentChange) { + return uriEqualToOneAtLeast(matchResource).apply((ResourceAttachmentChange)input); + } else { + return Iterators.any(input.getRefinedBy().iterator(), isCandidate(matchResource)); + } + } + }; + } + + /** + * Predicate to check if the URI of the current attachment change is equal to one (at least) of the URIs + * of the resources matched by the given <code>MatchResource</code>. + * + * @param matchResource + * The match resource. + * @return The predicate. + */ + private static Predicate<ResourceAttachmentChange> uriEqualToOneAtLeast(final MatchResource matchResource) { + return new Predicate<ResourceAttachmentChange>() { + public boolean apply(ResourceAttachmentChange difference) { + final String diffResourceURI = difference.getResourceURI(); + return diffResourceURI != null + && (diffResourceURI.equals(matchResource.getLeftURI()) + || diffResourceURI.equals(matchResource.getRightURI()) || diffResourceURI + .equals(matchResource.getOriginURI())); + } + }; + } + + /** + * Predicate to check if the URI of the current attachment change is different from all the URIs of the + * resources matched by the given <code>MatchResource</code>. + * + * @param matchResource + * The match resource. + * @return The predicate. + * @since 3.0 + */ + public static final Predicate<ResourceAttachmentChange> uriDifferentFromAll( + final MatchResource matchResource) { + return not(uriEqualToOneAtLeast(matchResource)); + } + + /** * {@inheritDoc} * * @see org.eclipse.emf.compare.provider.MatchResourceItemProvider#getText(java.lang.Object) diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/impl/EmptyMatchedResourcesFilter.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/impl/EmptyMatchedResourcesFilter.java index 657237a23..acd374e64 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/impl/EmptyMatchedResourcesFilter.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/impl/EmptyMatchedResourcesFilter.java @@ -14,12 +14,13 @@ import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Iterables.isEmpty; import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.compare.Diff; import org.eclipse.emf.compare.MatchResource; import org.eclipse.emf.compare.ResourceAttachmentChange; -import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.IDifferenceFilter; +import org.eclipse.emf.compare.provider.spec.MatchResourceItemProviderSpec; import org.eclipse.emf.ecore.EObject; /** @@ -40,14 +41,8 @@ public class EmptyMatchedResourcesFilter extends AbstractDifferenceFilter { Iterable<ResourceAttachmentChange> resourceAttachmentchanges = filter(differences, ResourceAttachmentChange.class); if (!isEmpty(resourceAttachmentchanges)) { - for (ResourceAttachmentChange rac : resourceAttachmentchanges) { - final String diffResourceURI = rac.getResourceURI(); - if (!diffResourceURI.equals(((MatchResource)input).getLeftURI()) - && !diffResourceURI.equals(((MatchResource)input).getRightURI()) - && !diffResourceURI.equals(((MatchResource)input).getOriginURI())) { - return true; - } - } + return Iterables.all(resourceAttachmentchanges, MatchResourceItemProviderSpec + .uriDifferentFromAll((MatchResource)input)); } else { return true; } diff --git a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/internal/postprocessor/factories/AbstractChangeFactory.java b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/internal/postprocessor/factories/AbstractChangeFactory.java index 5a9fc15ec..da3cdd94f 100644 --- a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/internal/postprocessor/factories/AbstractChangeFactory.java +++ b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/internal/postprocessor/factories/AbstractChangeFactory.java @@ -28,6 +28,7 @@ import org.eclipse.emf.compare.Match; import org.eclipse.emf.compare.ReferenceChange; import org.eclipse.emf.compare.ResourceAttachmentChange; import org.eclipse.emf.compare.util.CompareSwitch; +import org.eclipse.emf.compare.utils.MatchUtil; import org.eclipse.emf.ecore.EObject; /** @@ -370,17 +371,40 @@ public abstract class AbstractChangeFactory implements IChangeFactory { } /** - * Get all the add and delete changes on the objects contained in the one concerned by the given reference - * change. + * Get all the add and delete changes on the objects contained in the one concerned by the given + * difference. * * @param input - * The given reference change. + * The given difference. * @return The found differences. */ - protected Set<Diff> getAllContainedDifferences(ReferenceChange input) { + protected Set<Diff> getAllContainedDifferences(Diff input) { + final Set<Diff> result = new HashSet<Diff>(); + final Comparison comparison = input.getMatch().getComparison(); - final Match match = comparison.getMatch(input.getValue()); - final Set<Diff> result = getAllContainedDifferences(comparison, match); + + CompareSwitch<EObject> valueGetter = new CompareSwitch<EObject>() { + @Override + public EObject caseReferenceChange(ReferenceChange object) { + return object.getValue(); + } + + @Override + public EObject caseResourceAttachmentChange(ResourceAttachmentChange object) { + return MatchUtil.getContainer(object.getMatch().getComparison(), object); + } + + @Override + public EObject defaultCase(EObject object) { + return null; + } + }; + EObject value = valueGetter.doSwitch(input); + + if (value != null) { + final Match match = comparison.getMatch(value); + result.addAll(getAllContainedDifferences(comparison, match)); + } return result; } @@ -423,7 +447,7 @@ public abstract class AbstractChangeFactory implements IChangeFactory { // Keep only unit changes... if (!getExtensionKind().isInstance(candidate)) { // ... which are not related to an other macroscopic ADD or DELETE of a graphical object. - if (!(candidate instanceof ReferenceChange && (isRelatedToAnExtensionAdd((ReferenceChange)candidate) || isRelatedToAnExtensionDelete((ReferenceChange)candidate)))) { + if (!isAMainRefiningDifference(candidate)) { result.add(candidate); } else if (candidate instanceof ReferenceChange && ((ReferenceChange)candidate).getReference().isContainment()) { @@ -444,6 +468,33 @@ public abstract class AbstractChangeFactory implements IChangeFactory { } /** + * It checks that the given difference is the main difference of a macroscopic change. + * + * @param difference + * the difference to check. + * @return True if the given difference is the main difference of a macroscopic change. + */ + private boolean isAMainRefiningDifference(Diff difference) { + CompareSwitch<Boolean> compareSwitch = new CompareSwitch<Boolean>() { + @Override + public Boolean caseReferenceChange(ReferenceChange object) { + return isRelatedToAnExtensionAdd(object) || isRelatedToAnExtensionDelete(object); + } + + @Override + public Boolean caseResourceAttachmentChange(ResourceAttachmentChange object) { + return isRelatedToAnExtensionAdd(object) || isRelatedToAnExtensionDelete(object); + } + + @Override + public Boolean defaultCase(EObject object) { + return Boolean.FALSE; + } + }; + return compareSwitch.doSwitch(difference).booleanValue(); + } + + /** * Get the distinct differences refined by the given differences. * * @param refiningDifferences |