| /******************************************************************************* |
| * Copyright (c) 2014 EclipseSource Muenchen GmbH and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Philip Langer - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.emf.compare.uml2.rcp.ui.internal.accessor; |
| |
| import org.eclipse.emf.common.notify.AdapterFactory; |
| import org.eclipse.emf.compare.Diff; |
| import org.eclipse.emf.compare.DifferenceKind; |
| import org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.impl.ManyStructuralFeatureAccessorImpl; |
| import org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide; |
| import org.eclipse.emf.compare.uml2.internal.OpaqueElementBodyChange; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.EStructuralFeature; |
| import org.eclipse.uml2.uml.OpaqueAction; |
| import org.eclipse.uml2.uml.OpaqueBehavior; |
| import org.eclipse.uml2.uml.OpaqueExpression; |
| import org.eclipse.uml2.uml.UMLPackage; |
| |
| /** |
| * An accessor for {@link OpaqueElementBodyChange opaque element body changes} that represent moves of |
| * language/body values of {@link OpaqueAction}, {@link OpaqueBehavior}, and {@link OpaqueExpression}. For |
| * moves of language/body values, we show the list of language values for the left-hand side and the |
| * right-hand side. |
| * |
| * @author Philip Langer <planger@eclipsesource.com> |
| */ |
| public class OpaqueElementBodyMoveAccessor extends ManyStructuralFeatureAccessorImpl { |
| |
| /** |
| * Creates a new accessor for {@link OpaqueElementBodyChange opaque element body changes} that represent |
| * moves of body languages. |
| * |
| * @param adapterFactory |
| * the adapater factory used to create the accessor. |
| * @param bodyChange |
| * The change to be accessed by this accessor. |
| * @param side |
| * The side of this accessor. |
| */ |
| public OpaqueElementBodyMoveAccessor(AdapterFactory adapterFactory, OpaqueElementBodyChange bodyChange, |
| MergeViewerSide side) { |
| super(adapterFactory, bodyChange, side); |
| if (!DifferenceKind.MOVE.equals(bodyChange.getKind())) { |
| throw new IllegalArgumentException("This accessor handles only opaque element body moves."); //$NON-NLS-1$ |
| } |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * @see org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.impl. |
| * AbstractStructuralFeatureAccessor.getAffectedFeature(Diff) |
| */ |
| @Override |
| protected EStructuralFeature getAffectedFeature(Diff diff) { |
| /* |
| * This accessor handles only opaque element changes that represent moves. For such changes, we |
| * display the list of languages. Thus, only the language feature is of interest. We need the |
| * respective language feature depending on the type of the changed object (e.g., OpaqueBehavior). As |
| * the side does not matter, we just return the language feature of the left-hand side's object's |
| * type. Also, getMatch().getLeft() can never be null, since it would not be a move if it would have |
| * been deleted on the left-hand side. |
| */ |
| return getLanguageFeature(diff.getMatch().getLeft()); |
| } |
| |
| /** |
| * Returns the language feature of the given {@code object} depending on whether it is an |
| * {@link OpaqueAction}, {@link OpaqueBehavior}, or {@link OpaqueExpression}. |
| * <p> |
| * If {@code object} is not any of those types, an {@link IllegalArgumentException} is thrown, since this |
| * must never happen and something beforehand went horribly wrong. |
| * </p> |
| * |
| * @param object |
| * The instance of {@link OpaqueAction}, {@link OpaqueBehavior}, or {@link OpaqueExpression} to |
| * get the language feature for. |
| * @return The language feature of {@link #eObject}. |
| */ |
| private EStructuralFeature getLanguageFeature(final EObject object) { |
| final EStructuralFeature languageFeature; |
| if (object instanceof OpaqueAction) { |
| languageFeature = UMLPackage.eINSTANCE.getOpaqueAction_Language(); |
| } else if (object instanceof OpaqueBehavior) { |
| languageFeature = UMLPackage.eINSTANCE.getOpaqueBehavior_Language(); |
| } else if (object instanceof OpaqueExpression) { |
| languageFeature = UMLPackage.eINSTANCE.getOpaqueExpression_Language(); |
| } else { |
| throw new IllegalArgumentException("Cannot get language feature of the class " //$NON-NLS-1$ |
| + object.eClass().getName()); |
| } |
| return languageFeature; |
| } |
| } |