/*******************************************************************************
* Copyright (c) 2012, 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.ide.ui.internal.contentmergeviewer.tree;
import static org.eclipse.emf.compare.ide.utils.ResourceUtil.saveAllResources;
import static org.eclipse.emf.compare.ide.utils.ResourceUtil.saveResource;
import com.google.common.collect.ImmutableMap;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.ITypedElement;
import org.eclipse.compare.contentmergeviewer.IMergeViewerContentProvider;
import org.eclipse.compare.structuremergeviewer.ICompareInput;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.compare.Match;
import org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration;
import org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.accessor.AccessorAdapter;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Image;
/**
* An {@link IMergeViewerContentProvider} that delegates <code>getXXXImage(Object)</code> and
* <code>getXXXText()</code> to a {@link CompareConfiguration}.
* <p>
* <code>getXXXContent()</code> is computed by getting the side form the given object or from its parent if
* null, recursively.
*
* @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
*/
public class TreeContentMergeViewerContentProvider implements IMergeViewerContentProvider {
/**
* The stored {@link CompareConfiguration} to delegates most methods of this object.
*/
private final EMFCompareConfiguration fCompareConfiguration;
/**
* Creates a new {@link TreeContentMergeViewerContentProvider} and stored the given
* {@link CompareConfiguration}.
*
* @param cc
* the {@link CompareConfiguration} that will be used to get label and image of left, right and
* ancestor.
* @param comparison
* the comparison that is to be displayed by this viewer.
*/
public TreeContentMergeViewerContentProvider(EMFCompareConfiguration cc) {
this.fCompareConfiguration = cc;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose() {
// empty default implementation
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
* java.lang.Object, java.lang.Object)
*/
public void inputChanged(Viewer v, Object o1, Object o2) {
// we are not interested in since we have no state
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.contentmergeviewer.IMergeViewerContentProvider#getAncestorLabel(java.lang.Object)
*/
public String getAncestorLabel(Object element) {
return fCompareConfiguration.getAncestorLabel(element);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.contentmergeviewer.IMergeViewerContentProvider#getAncestorImage(java.lang.Object)
*/
public Image getAncestorImage(Object element) {
return fCompareConfiguration.getAncestorImage(element);
}
public Object getAncestorContent(Object element) {
if (element instanceof ICompareInput) {
ITypedElement ancestor = ((ICompareInput)element).getAncestor();
if (ancestor instanceof AccessorAdapter) {
return ((AccessorAdapter)ancestor).getTarget();
}
return ancestor;
}
return null;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.contentmergeviewer.IMergeViewerContentProvider#showAncestor(java.lang.Object)
*/
public boolean showAncestor(Object element) {
if (element instanceof ICompareInput) {
return true; // fix for #45239: Show ancestor for incoming and outgoing changes
}
// return (((ICompareInput)element).getKind() & Differencer.DIRECTION_MASK) ==
// Differencer.CONFLICTING;
return false;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.contentmergeviewer.IMergeViewerContentProvider#getLeftLabel(java.lang.Object)
*/
public String getLeftLabel(Object element) {
return fCompareConfiguration.getLeftLabel(element);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.contentmergeviewer.IMergeViewerContentProvider#getLeftImage(java.lang.Object)
*/
public Image getLeftImage(Object element) {
return fCompareConfiguration.getLeftImage(element);
}
public Object getLeftContent(Object element) {
if (element instanceof ICompareInput) {
ITypedElement left = ((ICompareInput)element).getLeft();
if (left instanceof AccessorAdapter) {
return ((AccessorAdapter)left).getTarget();
}
return left;
}
return null;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.contentmergeviewer.IMergeViewerContentProvider#isLeftEditable(java.lang.Object)
*/
public boolean isLeftEditable(Object element) {
return fCompareConfiguration.isLeftEditable();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.contentmergeviewer.IMergeViewerContentProvider#saveLeftContent(java.lang.Object,
* byte[])
*/
public void saveLeftContent(Object element, byte[] bytes) {
EList<Match> matches = fCompareConfiguration.getComparison().getMatches();
EObject leftEObject = null;
for (Match match : matches) {
leftEObject = match.getLeft();
if (leftEObject != null) {
break;
}
}
if (leftEObject != null) {
Resource eResource = leftEObject.eResource();
if (eResource != null) {
ResourceSet resourceSet = eResource.getResourceSet();
if (resourceSet != null) {
saveAllResources(resourceSet, ImmutableMap.of(Resource.OPTION_SAVE_ONLY_IF_CHANGED,
Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER));
} else {
saveResource(eResource, ImmutableMap.of(Resource.OPTION_SAVE_ONLY_IF_CHANGED,
Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER));
}
}
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.contentmergeviewer.IMergeViewerContentProvider#getRightLabel(java.lang.Object)
*/
public String getRightLabel(Object element) {
return fCompareConfiguration.getRightLabel(element);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.contentmergeviewer.IMergeViewerContentProvider#getRightImage(java.lang.Object)
*/
public Image getRightImage(Object element) {
return fCompareConfiguration.getRightImage(element);
}
public Object getRightContent(Object element) {
if (element instanceof ICompareInput) {
ITypedElement right = ((ICompareInput)element).getRight();
if (right instanceof AccessorAdapter) {
return ((AccessorAdapter)right).getTarget();
}
return right;
}
return null;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.contentmergeviewer.IMergeViewerContentProvider#isRightEditable(java.lang.Object)
*/
public boolean isRightEditable(Object element) {
return fCompareConfiguration.isRightEditable();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.contentmergeviewer.IMergeViewerContentProvider#saveRightContent(java.lang.Object,
* byte[])
*/
public void saveRightContent(Object element, byte[] bytes) {
EList<Match> matches = fCompareConfiguration.getComparison().getMatches();
EObject rightEObject = null;
for (Match match : matches) {
rightEObject = match.getRight();
if (rightEObject != null) {
break;
}
}
if (rightEObject != null) {
Resource eResource = rightEObject.eResource();
if (eResource != null) {
ResourceSet resourceSet = eResource.getResourceSet();
if (resourceSet != null) {
saveAllResources(resourceSet, ImmutableMap.of(Resource.OPTION_SAVE_ONLY_IF_CHANGED,
Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER));
} else {
saveResource(eResource, ImmutableMap.of(Resource.OPTION_SAVE_ONLY_IF_CHANGED,
Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER));
}
}
}
}
}