/*******************************************************************************
* Copyright (c) 2012, 2014 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.structuremergeviewer;
import org.eclipse.compare.structuremergeviewer.ICompareInput;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.compare.ide.ui.internal.util.StyledStringConverter;
import org.eclipse.emf.compare.provider.EMFCompareEditPlugin;
import org.eclipse.emf.compare.provider.IItemStyledLabelProvider;
import org.eclipse.emf.compare.provider.spec.OverlayImageProvider;
import org.eclipse.emf.compare.rcp.ui.EMFCompareRCPUIPlugin;
import org.eclipse.emf.edit.provider.ItemProviderAdapter;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.progress.PendingUpdateAdapter;
/**
* A specialized {@link AdapterFactoryLabelProvider.FontAndColorProvider} for the structure merge viewer.
*
* @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
*/
class EMFCompareStructureMergeViewerLabelProvider extends AdapterFactoryLabelProvider.FontAndColorProvider implements IStyledLabelProvider {
protected StyledStringConverter styledStringConverter;
private OverlayImageProvider overlayImageProvider;
/**
* Constructor calling super {@link #FontAndColorProvider(AdapterFactory, Viewer)}.
*
* @param adapterFactory
* The adapter factory.
* @param viewer
* The viewer.
*/
public EMFCompareStructureMergeViewerLabelProvider(AdapterFactory adapterFactory, Viewer viewer) {
super(adapterFactory, viewer);
overlayImageProvider = new OverlayImageProvider(EMFCompareEditPlugin.getPlugin());
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
return getStyledText(element).getString();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getFont(java.lang.Object)
*/
@Override
public Font getFont(Object object) {
if (object instanceof Adapter) {
return super.getFont(((Adapter)object).getTarget());
}
return super.getFont(object);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getForeground(java.lang.Object)
*/
@Override
public Color getForeground(Object object) {
if (object instanceof Adapter) {
return super.getForeground(((Adapter)object).getTarget());
}
return super.getForeground(object);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getBackground(java.lang.Object)
*/
@Override
public Color getBackground(Object object) {
if (object instanceof Adapter) {
return super.getBackground(((Adapter)object).getTarget());
}
return super.getBackground(object);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getImage(java.lang.Object)
*/
@Override
public Image getImage(Object element) {
final Image ret;
if (element instanceof ItemProviderAdapter) {
ret = super.getImage(element);
} else if (element instanceof Adapter) {
ret = super.getImage(((Adapter)element).getTarget());
} else if (element instanceof ICompareInput) {
ret = ((ICompareInput)element).getImage();
} else if (element instanceof PendingUpdateAdapter) {
ret = super.getImageFromObject(overlayImageProvider.getComposedImage(element,
EMFCompareRCPUIPlugin.getImage("icons/full/toolb16/group.gif"))); //$NON-NLS-1$
} else {
ret = super.getImage(element);
}
return ret;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider.getStyledText(
* java .lang.Object)
*/
@Override
public StyledString getStyledText(Object element) {
final StyledString ret;
if (element instanceof ItemProviderAdapter) {
ret = getStyledTextFromObject(element);
} else if (element instanceof Adapter) {
ret = getStyledTextFromObject(((Adapter)element).getTarget());
} else if (element instanceof ICompareInput) {
ret = getStyledTextFromObject(((ICompareInput)element).getName());
} else if (element instanceof PendingUpdateAdapter) {
ret = new StyledString("Please wait while computing the element to display...");
} else {
ret = getStyledTextFromObject(element);
}
return ret;
}
/**
* Returns the styled text string of the given <code>object</code> by adapting it to
* {@link IItemStyledLabelProvider} and asking for its
* {@link IItemStyledLabelProvider#getStyledText(Object) text}. Returns null if <code>object</code> is
* null.
*
* @param object
* the object from which we want a text
* @return the text, or null if object is null.
* @throws NullPointerException
* if <code>adapterFactory</code> is null.
*/
private StyledString getStyledTextFromObject(final Object object) {
if (object == null) {
return null;
}
StyledString ret = null;
Object itemStyledLabelProvider = getAdapterFactory().adapt(object, IItemStyledLabelProvider.class);
if (itemStyledLabelProvider instanceof IItemStyledLabelProvider) {
ret = getStyledStringConverter().toJFaceStyledString(
((IItemStyledLabelProvider)itemStyledLabelProvider).getStyledText(object));
}
if (ret == null) {
ret = new StyledString(object.toString());
}
return ret;
}
/**
* Returns the StyledStringConverter used to convert emf compare styled strings to jface styled strings.
*
* @return the styledStringConverter.
*/
protected StyledStringConverter getStyledStringConverter() {
if (styledStringConverter == null) {
styledStringConverter = new StyledStringConverter(getDefaultFont(), getDefaultForeground(),
getDefaultBackground());
}
return styledStringConverter;
}
}