package com.sap.furcas.ide.editor.imp.services; import java.util.ArrayList; import java.util.Collection; import org.eclipse.core.runtime.Assert; import org.eclipse.imp.editor.ModelTreeNode; import org.eclipse.imp.services.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.swt.graphics.Image; import com.sap.furcas.metamodel.FURCAS.textblocks.LexedToken; import com.sap.furcas.metamodel.FURCAS.textblocks.TextBlock; /** * An {@link ILabelProvider} to be used by the IMP outline view. * This implementation is backed by the generated EMF label provider. * * @author Stephan Erb * */ public class FurcasLabelProvider implements ILabelProvider { private org.eclipse.jface.viewers.ILabelProvider labelProvider; private final Collection<ILabelProviderListener> deferredListeners = new ArrayList<ILabelProviderListener>(1); /** * Set a label provider that this provider shall delegate to. * * We use this deferred initalization because then language implementations don't * have to register their own label provider. They can use this generic implementation. */ public void plugProvider(org.eclipse.jface.viewers.ILabelProvider provider) { Assert.isLegal(labelProvider == null, "Re-plugging not supported"); this.labelProvider = provider; for (ILabelProviderListener listener : deferredListeners) { labelProvider.addListener(listener); } deferredListeners.clear(); } private Object unwrap(Object object) { if (object instanceof TextBlock) { TextBlock block = (TextBlock) object; if (!block.getCorrespondingModelElements().isEmpty()) { return block.getCorrespondingModelElements().iterator().next(); } return object; } else if (object instanceof LexedToken) { LexedToken token = (LexedToken) object; if (!token.getReferencedElements().isEmpty()) { return token.getReferencedElements().iterator().next(); } return object; } else if (object instanceof ModelTreeNode) { return unwrap(((ModelTreeNode) object).getASTNode()); } else { return object; } } @Override public Image getImage(Object element) { if (labelProvider != null) { return labelProvider.getImage(unwrap(element)); } else { return null; } } @Override public String getText(Object element) { if (labelProvider != null) { return labelProvider.getText(unwrap(element)); } else { return null; } } @Override public void addListener(ILabelProviderListener listener) { if (labelProvider != null) { labelProvider.addListener(listener); } else { this.deferredListeners.add(listener); } } @Override public void dispose() { if (labelProvider != null) { labelProvider.dispose(); } labelProvider = null; deferredListeners.clear(); } @Override public boolean isLabelProperty(Object element, String property) { if (labelProvider != null) { return labelProvider.isLabelProperty(unwrap(element), property); } else { return false; } } @Override public void removeListener(ILabelProviderListener listener) { if (labelProvider != null) { labelProvider.removeListener(listener); } else { this.deferredListeners.remove(listener); } } }