/******************************************************************************* * 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.ide.ui.internal.accessor; import com.google.common.collect.Lists; import java.util.List; import org.eclipse.emf.compare.Comparison; import org.eclipse.emf.compare.Diff; import org.eclipse.emf.compare.Match; import org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.legacy.ITypedElement; import org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide; import org.eclipse.emf.ecore.EObject; import org.eclipse.gmf.runtime.notation.Diagram; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.swt.graphics.Image; /** * Input of each diagram merge viewer when a match is selected. * * @author <a href="mailto:cedric.notot@obeo.fr">Cedric Notot</a> */ public class DiagramMatchAccessorImpl implements IDiagramNodeAccessor, ITypedElement { /** The comparison. */ protected Comparison fComparison; /** The related match object. */ private Match fMatch; /** The side to impact. */ private MergeViewerSide fSide; /** * Constructor. * * @param match * The related match object. * @param side * The side to impact. */ public DiagramMatchAccessorImpl(Match match, MergeViewerSide side) { this.fMatch = match; this.fSide = side; fComparison = match.getComparison(); } /** * {@inheritDoc} * * @see org.eclipse.compare.ITypedElement#getName() */ public String getName() { return this.getClass().getName(); } /** * {@inheritDoc} * * @see org.eclipse.compare.ITypedElement#getImage() */ public Image getImage() { // if (getStructuralFeature() instanceof EAttribute) { // return ExtendedImageRegistry.getInstance().getImage( // EcoreEditPlugin.getPlugin().getImage("full/obj16/EAttribute")); //$NON-NLS-1$ // } else { // return ExtendedImageRegistry.getInstance().getImage( // EcoreEditPlugin.getPlugin().getImage("full/obj16/EReference")); //$NON-NLS-1$ // } return null; } /** * {@inheritDoc} * * @see org.eclipse.compare.ITypedElement#getType() */ public String getType() { return DiagramContentMergeViewerConstants.MATCH_NODE_TYPE; } /** * {@inheritDoc} * * @see org.eclipse.emf.compare.diagram.ide.ui.internal.accessor.IDiagramNodeAccessor#getEObject(org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide) */ public EObject getEObject(MergeViewerSide side) { return getEObject(fMatch, side); } /** * Get the object from the given side. * * @param match * The match of the expected object. * @param side * The side to look for. * @return The found object. */ protected EObject getEObject(Match match, MergeViewerSide side) { EObject result = null; switch (side) { case LEFT: result = match.getLeft(); break; case RIGHT: result = match.getRight(); break; case ANCESTOR: result = match.getOrigin(); break; default: } return result; } /** * {@inheritDoc} * * @see org.eclipse.emf.compare.diagram.ide.ui.internal.accessor.IDiagramNodeAccessor#getDiagram(org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide) */ public Diagram getDiagram(MergeViewerSide side) { Diagram diagram = null; EObject obj = getEObject(side); if (obj != null) { diagram = getDiagram(obj); } else { for (MergeViewerSide oppositeSide : getOtherSides(side)) { obj = getEObject(oppositeSide); if (obj != null) { diagram = getDiagram(obj); if (diagram != null) { Match diagramMatch = fComparison.getMatch(diagram); diagram = (Diagram)getEObject(diagramMatch, side); break; } } } } return diagram; } /** * {@inheritDoc} * * @see org.eclipse.emf.compare.diagram.ide.ui.internal.accessor.IDiagramNodeAccessor#getOwnedDiagram() */ public Diagram getOwnedDiagram() { return getDiagram(fSide); } /** * {@inheritDoc} * * @see org.eclipse.emf.compare.diagram.ide.ui.internal.accessor.IDiagramNodeAccessor#getOwnedView() */ public View getOwnedView() { EObject result = getEObject(fSide); if (result == null || !(result instanceof View)) { result = getDiagram(fSide); } return (View)result; } /** * Get the related diagram from the given object. * * @param obj * The object. * @return The diagram. */ protected Diagram getDiagram(EObject obj) { Diagram diagram = null; if (obj instanceof Diagram) { diagram = (Diagram)obj; } else if (obj instanceof View) { diagram = ((View)obj).getDiagram(); } return diagram; } /** * {@inheritDoc} * * @see org.eclipse.emf.compare.diagram.ide.ui.internal.accessor.IDiagramNodeAccessor#getComparison() */ public Comparison getComparison() { return fComparison; } /** * {@inheritDoc} * * @see org.eclipse.emf.compare.diagram.ide.ui.internal.accessor.IDiagramNodeAccessor#getOriginSide() */ public MergeViewerSide getOriginSide() { EObject origin = getEObject(MergeViewerSide.ANCESTOR); if (origin == null) { return fSide.opposite(); } else { return MergeViewerSide.ANCESTOR; } } /** * {@inheritDoc} * * @see org.eclipse.emf.compare.diagram.ide.ui.internal.accessor.IDiagramNodeAccessor#getSide() */ public MergeViewerSide getSide() { return fSide; } /** * {@inheritDoc} * * @see org.eclipse.emf.compare.diagram.ide.ui.internal.accessor.IDiagramNodeAccessor#getAllDiffs() */ public List<Diff> getAllDiffs() { return fComparison.getDifferences(); } /** * Get the opposite sides of the given one. * * @param side * The given side. * @return the opposite ones. */ private List<MergeViewerSide> getOtherSides(MergeViewerSide side) { List<MergeViewerSide> ret = null; switch (side) { case ANCESTOR: ret = Lists.newArrayList(MergeViewerSide.LEFT, MergeViewerSide.RIGHT); break; case LEFT: ret = Lists.newArrayList(MergeViewerSide.RIGHT, MergeViewerSide.ANCESTOR); break; case RIGHT: ret = Lists.newArrayList(MergeViewerSide.LEFT, MergeViewerSide.ANCESTOR); break; default: ret = Lists.newArrayList(); } return ret; } }