/*******************************************************************************
* Copyright (c) 2014, 2015 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;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.IViewerCreator;
import org.eclipse.compare.contentmergeviewer.TextMergeViewer;
import org.eclipse.compare.internal.MergeViewerContentProvider;
import org.eclipse.compare.structuremergeviewer.ICompareInput;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIMessages;
import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIPlugin;
import org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration;
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.CompareInputAdapter;
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.ForwardingCompareInput;
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.provider.TreeNodeCompareInput;
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.provider.TreeNodeCompareInputLabelProvider;
import org.eclipse.emf.compare.internal.utils.ComparisonUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.tree.TreeNode;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
/**
* @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
*/
public class TextFallbackCompareViewerCreator implements IViewerCreator {
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.IViewerCreator#createViewer(org.eclipse.swt.widgets.Composite,
* org.eclipse.compare.CompareConfiguration)
*/
public Viewer createViewer(Composite parent, CompareConfiguration config) {
final EMFCompareConfiguration emfConfig = new EMFCompareConfiguration(config);
emfConfig.setLabelProvider(TreeNodeCompareInput.class, new TreeNodeCompareInputLabelProvider());
return new TextFallbackMergeViewer(parent, emfConfig);
}
private static ICompareInput getAdaptedCompareInput(CompareInputAdapter input) {
final ICompareInput adaptedCompareInput;
Notifier target = input.getTarget();
if (target instanceof TreeNode) {
TreeNode treeNode = (TreeNode)target;
EObject data = treeNode.getData();
Comparison comparison = ComparisonUtil.getComparison(data);
if (comparison != null) {
ICompareInput compareInput = (ICompareInput)EcoreUtil.getAdapter(comparison.eAdapters(),
ICompareInput.class);
if (compareInput instanceof ForwardingCompareInput) {
adaptedCompareInput = ((ForwardingCompareInput)compareInput).delegate();
} else {
adaptedCompareInput = compareInput;
}
} else {
adaptedCompareInput = null;
EMFCompareIDEUIPlugin.getDefault().log(IStatus.ERROR,
"Cannot find a comparison from input " + input); //$NON-NLS-1$
}
} else {
adaptedCompareInput = null;
}
return adaptedCompareInput;
}
/**
* @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
*/
private static final class TextFallbackMergeViewer extends TextMergeViewer {
private Object originalInput;
/**
* @param parent
* @param configuration
*/
private TextFallbackMergeViewer(Composite parent, CompareConfiguration configuration) {
super(parent, configuration);
setContentProvider(new TextFallbackMergeViewerContentProvider(configuration));
}
@Override
public void setInput(Object input) {
originalInput = input;
if (input instanceof CompareInputAdapter) {
super.setInput(getAdaptedCompareInput((CompareInputAdapter)input));
} else if (input instanceof ForwardingCompareInput) {
super.setInput(((ForwardingCompareInput)input).delegate());
} else {
super.setInput(input);
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.ContentViewer#getInput()
*/
@Override
public Object getInput() {
return originalInput;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.contentmergeviewer.TextMergeViewer#handleDispose(org.eclipse.swt.events.DisposeEvent)
*/
@Override
protected void handleDispose(DisposeEvent event) {
super.handleDispose(event);
originalInput = null;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#getTitle()
*/
@Override
public String getTitle() {
return EMFCompareIDEUIMessages.getString("TextFallbackCompareViewer.title"); //$NON-NLS-1$
}
}
/**
* @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
*/
private static final class TextFallbackMergeViewerContentProvider extends MergeViewerContentProvider {
/**
* @param cc
*/
private TextFallbackMergeViewerContentProvider(CompareConfiguration cc) {
super(cc);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.internal.MergeViewerContentProvider#isLeftEditable(java.lang.Object)
*/
@Override
public boolean isLeftEditable(Object element) {
final boolean leftEditable;
if (element instanceof CompareInputAdapter) {
ICompareInput adaptedCompareInput = getAdaptedCompareInput((CompareInputAdapter)element);
if (adaptedCompareInput != null) {
leftEditable = super.isLeftEditable(adaptedCompareInput);
} else {
leftEditable = super.isLeftEditable(element);
}
} else {
leftEditable = super.isLeftEditable(element);
}
return leftEditable;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.internal.MergeViewerContentProvider#isRightEditable(java.lang.Object)
*/
@Override
public boolean isRightEditable(Object element) {
final boolean rightEditable;
if (element instanceof CompareInputAdapter) {
ICompareInput adaptedCompareInput = getAdaptedCompareInput((CompareInputAdapter)element);
if (adaptedCompareInput != null) {
rightEditable = super.isRightEditable(adaptedCompareInput);
} else {
rightEditable = super.isRightEditable(element);
}
} else {
rightEditable = super.isRightEditable(element);
}
return rightEditable;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.internal.MergeViewerContentProvider#saveLeftContent(java.lang.Object,
* byte[])
*/
@Override
public void saveLeftContent(Object element, byte[] bytes) {
if (element instanceof CompareInputAdapter) {
ICompareInput adaptedCompareInput = getAdaptedCompareInput((CompareInputAdapter)element);
if (adaptedCompareInput != null) {
super.saveLeftContent(adaptedCompareInput, bytes);
} else {
super.saveLeftContent(element, bytes);
}
} else {
super.saveLeftContent(element, bytes);
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.internal.MergeViewerContentProvider#saveRightContent(java.lang.Object,
* byte[])
*/
@Override
public void saveRightContent(Object element, byte[] bytes) {
if (element instanceof CompareInputAdapter) {
ICompareInput adaptedCompareInput = getAdaptedCompareInput((CompareInputAdapter)element);
if (adaptedCompareInput != null) {
super.saveRightContent(adaptedCompareInput, bytes);
} else {
super.saveRightContent(element, bytes);
}
} else {
super.saveRightContent(element, bytes);
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.internal.MergeViewerContentProvider#getAncestorLabel(java.lang.Object)
*/
@Override
public String getAncestorLabel(Object element) {
final String ancestorLabel;
if (element instanceof CompareInputAdapter) {
ICompareInput adaptedCompareInput = getAdaptedCompareInput((CompareInputAdapter)element);
if (adaptedCompareInput != null) {
ancestorLabel = super.getAncestorLabel(adaptedCompareInput);
} else {
ancestorLabel = super.getAncestorLabel(element);
}
} else {
ancestorLabel = super.getAncestorLabel(element);
}
return ancestorLabel;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.internal.MergeViewerContentProvider#getAncestorImage(java.lang.Object)
*/
@Override
public Image getAncestorImage(Object element) {
final Image ancestorImage;
if (element instanceof CompareInputAdapter) {
ICompareInput adaptedCompareInput = getAdaptedCompareInput((CompareInputAdapter)element);
if (adaptedCompareInput != null) {
ancestorImage = super.getAncestorImage(adaptedCompareInput);
} else {
ancestorImage = super.getAncestorImage(element);
}
} else {
ancestorImage = super.getAncestorImage(element);
}
return ancestorImage;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.internal.MergeViewerContentProvider#getAncestorContent(java.lang.Object)
*/
@Override
public Object getAncestorContent(Object element) {
final Object ancestorContent;
if (element instanceof CompareInputAdapter) {
ICompareInput adaptedCompareInput = getAdaptedCompareInput((CompareInputAdapter)element);
if (adaptedCompareInput != null) {
ancestorContent = super.getAncestorContent(adaptedCompareInput);
} else {
ancestorContent = super.getAncestorContent(element);
}
} else {
ancestorContent = super.getAncestorContent(element);
}
return ancestorContent;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.internal.MergeViewerContentProvider#getLeftLabel(java.lang.Object)
*/
@Override
public String getLeftLabel(Object element) {
final String leftLabel;
if (element instanceof CompareInputAdapter) {
ICompareInput adaptedCompareInput = getAdaptedCompareInput((CompareInputAdapter)element);
if (adaptedCompareInput != null) {
leftLabel = super.getLeftLabel(adaptedCompareInput);
} else {
leftLabel = super.getLeftLabel(element);
}
} else {
leftLabel = super.getLeftLabel(element);
}
return leftLabel;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.internal.MergeViewerContentProvider#getLeftImage(java.lang.Object)
*/
@Override
public Image getLeftImage(Object element) {
final Image leftImage;
if (element instanceof CompareInputAdapter) {
ICompareInput adaptedCompareInput = getAdaptedCompareInput((CompareInputAdapter)element);
if (adaptedCompareInput != null) {
leftImage = super.getLeftImage(adaptedCompareInput);
} else {
leftImage = super.getLeftImage(element);
}
} else {
leftImage = super.getLeftImage(element);
}
return leftImage;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.internal.MergeViewerContentProvider#getLeftContent(java.lang.Object)
*/
@Override
public Object getLeftContent(Object element) {
final Object leftContent;
if (element instanceof CompareInputAdapter) {
ICompareInput adaptedCompareInput = getAdaptedCompareInput((CompareInputAdapter)element);
if (adaptedCompareInput != null) {
leftContent = super.getLeftContent(adaptedCompareInput);
} else {
leftContent = super.getLeftContent(element);
}
} else {
leftContent = super.getLeftContent(element);
}
return leftContent;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.internal.MergeViewerContentProvider#getRightLabel(java.lang.Object)
*/
@Override
public String getRightLabel(Object element) {
final String rightLabel;
if (element instanceof CompareInputAdapter) {
ICompareInput adaptedCompareInput = getAdaptedCompareInput((CompareInputAdapter)element);
if (adaptedCompareInput != null) {
rightLabel = super.getRightLabel(adaptedCompareInput);
} else {
rightLabel = super.getRightLabel(element);
}
} else {
rightLabel = super.getRightLabel(element);
}
return rightLabel;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.internal.MergeViewerContentProvider#getRightImage(java.lang.Object)
*/
@Override
public Image getRightImage(Object element) {
final Image rightImage;
if (element instanceof CompareInputAdapter) {
ICompareInput adaptedCompareInput = getAdaptedCompareInput((CompareInputAdapter)element);
if (adaptedCompareInput != null) {
rightImage = super.getRightImage(adaptedCompareInput);
} else {
rightImage = super.getRightImage(element);
}
} else {
rightImage = super.getRightImage(element);
}
return rightImage;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.compare.internal.MergeViewerContentProvider#getRightContent(java.lang.Object)
*/
@Override
public Object getRightContent(Object element) {
final Object rightContent;
if (element instanceof CompareInputAdapter) {
ICompareInput adaptedCompareInput = getAdaptedCompareInput((CompareInputAdapter)element);
if (adaptedCompareInput != null) {
rightContent = super.getRightContent(adaptedCompareInput);
} else {
rightContent = super.getRightContent(element);
}
} else {
rightContent = super.getRightContent(element);
}
return rightContent;
}
}
}