blob: e2f1232b49d09a7ac5a2da8e0ae94952f0c23638 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 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.diagram.internal.extensions.provider.spec;
import com.google.common.base.Preconditions;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.compare.DifferenceKind;
import org.eclipse.emf.compare.DifferenceSource;
import org.eclipse.emf.compare.diagram.internal.extensions.DiagramDiff;
import org.eclipse.emf.compare.diagram.internal.extensions.provider.DiagramDiffItemProvider;
import org.eclipse.emf.compare.provider.AdapterFactoryUtil;
import org.eclipse.emf.compare.provider.ForwardingItemProvider;
import org.eclipse.emf.compare.provider.IItemDescriptionProvider;
import org.eclipse.emf.compare.provider.IItemStyledLabelProvider;
import org.eclipse.emf.compare.provider.ISemanticObjectLabelProvider;
import org.eclipse.emf.compare.provider.spec.OverlayImageProvider;
import org.eclipse.emf.compare.provider.utils.ComposedStyledString;
import org.eclipse.emf.compare.provider.utils.IStyledString.IComposedStyledString;
import org.eclipse.emf.compare.provider.utils.IStyledString.Style;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.provider.ItemProviderAdapter;
import org.eclipse.gmf.runtime.notation.View;
/**
* Unique item provider for every diagram differences.
*
* @author <a href="mailto:cedric.notot@obeo.fr">Cedric Notot</a>
*/
public class ForwardingDiagramDiffItemProvider extends ForwardingItemProvider implements IItemStyledLabelProvider, IItemDescriptionProvider, ISemanticObjectLabelProvider {
/** Used to describe the change. */
protected static final String HAS_BEEN = " has been "; //$NON-NLS-1$
/** Used to describe an illegal state exception. */
protected static final String UNSUPPORTED = "Unsupported "; //$NON-NLS-1$
/** Used to describe an illegal state exception. */
protected static final String VALUE = " value: "; //$NON-NLS-1$
/** The elide length. */
private static final int ELIDE_LENGTH = 50;
/** The image provider used with this item provider. */
private OverlayImageProvider overlayProvider;
/**
* Constructor.
*
* @param delegate
* Default item provider adapter.
*/
public ForwardingDiagramDiffItemProvider(ItemProviderAdapter delegate) {
super(delegate);
if (delegate instanceof DiagramDiffItemProvider) {
overlayProvider = new OverlayImageProvider(
((DiagramDiffItemProvider)delegate()).getResourceLocator());
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.compare.provider.ForwardingItemProvider#hasChildren(java.lang.Object)
*/
@Override
public boolean hasChildren(Object object) {
return !getChildren(object).isEmpty();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.compare.provider.ForwardingItemProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object object) {
return getStyledText(object).getString();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.compare.provider.ForwardingItemProvider#getImage(java.lang.Object)
*/
@Override
public Object getImage(Object object) {
final DiagramDiff diagramDiff = (DiagramDiff)object;
Object image = null;
if (diagramDiff.getView() instanceof View) {
image = getImage(getRootAdapterFactory(), diagramDiff.getView());
} else {
image = super.getImage(object);
}
if (overlayProvider != null && image != null) {
Object diffImage = overlayProvider.getComposedImage(diagramDiff, image);
return ((DiagramDiffItemProvider)delegate()).getOverlayImage(object, diffImage);
} else {
return image;
}
}
/**
* Returns the image of the given <code>object</code> by adapting it to {@link IItemLabelProvider} and
* asking for its {@link IItemLabelProvider#getImage(Object) text}. Returns null if <code>object</code> is
* null.
*
* @param adapterFactory
* the adapter factory to adapt from
* @param object
* the object from which we want a image
* @return the image, or null if object is null.
* @throws NullPointerException
* if <code>adapterFactory</code> is null.
*/
private static Object getImage(AdapterFactory adapterFactory, Object object) {
Preconditions.checkNotNull(adapterFactory);
if (object != null) {
Object adapter = adapterFactory.adapt(object, IItemLabelProvider.class);
if (adapter instanceof IItemLabelProvider) {
return ((IItemLabelProvider)adapter).getImage(object);
}
}
return null;
}
/**
* It builds the label of the item related to the given difference.
*
* @param diagramDiff
* the difference.
* @return the label.
*/
protected String getValueText(final DiagramDiff diagramDiff) {
return getValueText(diagramDiff.getView());
}
/**
* It builds the label of the item related to the given object.
*
* @param view
* the object.
* @return the label.
*/
protected String getValueText(EObject view) {
EObject reference = null;
if (view instanceof View) {
reference = view;
}
String value = AdapterFactoryUtil.getText(getRootAdapterFactory(), reference);
if (value == null) {
value = "<null>"; //$NON-NLS-1$
} else {
value = org.eclipse.emf.compare.provider.spec.Strings.elide(value, ELIDE_LENGTH, "..."); //$NON-NLS-1$
}
return value;
}
/**
* Returns the name of the main reference or the kind of attribute change linked to the given
* {@link DiagramDiff}.
*
* @param diagramDiff
* the given {@link DiagramDiff}.
* @return the name of the main reference or the kind of attribute change linked to the given
* {@link DiagramDiff}.
*/
protected String getReferenceText(final DiagramDiff diagramDiff) {
return " "; //$NON-NLS-1$
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getForeground(java.lang.Object)
*/
@Override
public Object getForeground(Object object) {
DiagramDiff referenceChange = (DiagramDiff)object;
switch (referenceChange.getState()) {
case MERGED:
case DISCARDED:
return URI.createURI("color://rgb/156/156/156"); //$NON-NLS-1$
default:
return super.getForeground(object);
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.compare.provider.IItemDescriptionProvider#getDescription(java.lang.Object)
*/
public String getDescription(Object object) {
final DiagramDiff diagramDiff = (DiagramDiff)object;
final String valueText = getValueText(diagramDiff);
final String referenceText = getReferenceText(diagramDiff);
String remotely = ""; //$NON-NLS-1$
if (diagramDiff.getSource() == DifferenceSource.RIGHT) {
remotely = "remotely "; //$NON-NLS-1$
}
String ret = ""; //$NON-NLS-1$
final String hasBeen = " has been "; //$NON-NLS-1$
switch (diagramDiff.getKind()) {
case ADD:
ret = valueText + hasBeen + remotely + "added to " + referenceText; //$NON-NLS-1$
break;
case DELETE:
ret = valueText + hasBeen + remotely + "deleted from " + referenceText; //$NON-NLS-1$
break;
case CHANGE:
ret = referenceText + " " + valueText + hasBeen + remotely + "change"; //$NON-NLS-1$ //$NON-NLS-2$
break;
case MOVE:
ret = valueText + hasBeen + remotely + "moved in " + referenceText; //$NON-NLS-1$
break;
default:
throw new IllegalStateException(
UNSUPPORTED + DifferenceKind.class.getSimpleName() + VALUE + diagramDiff.getKind());
}
return ret;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.compare.provider.IItemStyledLabelProvider#getStyledText(java.lang.Object)
*/
public IComposedStyledString getStyledText(Object object) {
final DiagramDiff diagramDiff = (DiagramDiff)object;
final String valueText = getValueText(diagramDiff);
final String referenceText = getReferenceText(diagramDiff);
ComposedStyledString ret = new ComposedStyledString(valueText);
ret.append(" [" + referenceText, Style.DECORATIONS_STYLER); //$NON-NLS-1$
buildStyledText(diagramDiff.getKind(), ret);
ret.append("]", Style.DECORATIONS_STYLER); //$NON-NLS-1$
return ret;
}
/**
* It builds the given {@link ComposedStyledString} adding the kind of change in description.
*
* @param kind
* The kind of change.
* @param ret
* The {@link ComposedStyledString} to build.
*/
protected void buildStyledText(final DifferenceKind kind, ComposedStyledString ret) {
switch (kind) {
case ADD:
ret.append(" add", Style.DECORATIONS_STYLER); //$NON-NLS-1$
break;
case DELETE:
ret.append(" delete", Style.DECORATIONS_STYLER); //$NON-NLS-1$
break;
case CHANGE:
ret.append(" change", Style.DECORATIONS_STYLER); //$NON-NLS-1$
break;
case MOVE:
ret.append(" move", Style.DECORATIONS_STYLER); //$NON-NLS-1$
break;
default:
throw new IllegalStateException(
UNSUPPORTED + DifferenceKind.class.getSimpleName() + VALUE + kind);
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.compare.provider.ISemanticObjectLabelProvider#getSemanticObjectLabel(java.lang.Object)
*/
public String getSemanticObjectLabel(Object object) {
final DiagramDiff diagramDiff = (DiagramDiff)object;
return getValueText(diagramDiff);
}
}