/*****************************************************************************
* Copyright (c) 2012 CEA LIST.
*
* 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:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
*****************************************************************************/
package org.eclipse.papyrus.infra.widgets.providers;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.swt.graphics.Image;
public class ExtensibleLabelProvider implements ILabelProvider, ILabelProviderListener {
private final Set<ILabelProviderListener> listeners;
private final SortedMap<Integer, List<IFilteredLabelProvider>> providers;
private final ILabelProvider defaultProvider;
public ExtensibleLabelProvider() {
listeners = new LinkedHashSet<ILabelProviderListener>();
providers = new TreeMap<Integer, List<IFilteredLabelProvider>>();
defaultProvider = new LabelProvider();
}
public void addListener(ILabelProviderListener listener) {
listeners.add(listener);
}
public void dispose() {
listeners.clear();
for(List<IFilteredLabelProvider> filteredProviders : providers.values()) {
for(IFilteredLabelProvider provider : filteredProviders) {
provider.dispose();
}
}
providers.clear();
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
listeners.remove(listener);
}
public void registerProvider(int priority, IFilteredLabelProvider provider) {
getProviders(priority).add(provider);
provider.addListener(this);
}
public Image getImage(Object element) {
return getProvider(element).getImage(element);
}
public String getText(Object element) {
return getProvider(element).getText(element);
}
protected final ILabelProvider getProvider(Object element) {
for(List<IFilteredLabelProvider> filteredProviders : providers.values()) {
for(IFilteredLabelProvider provider : filteredProviders) {
if(provider.accept(element)) {
return provider;
}
}
}
return defaultProvider;
}
protected final List<IFilteredLabelProvider> getProviders(int priority) {
if(!providers.containsKey(priority)) {
providers.put(priority, new LinkedList<IFilteredLabelProvider>());
}
return providers.get(priority);
}
/**
* {@inheritDoc}
*
* Forwards the event to each listener
*/
public void labelProviderChanged(LabelProviderChangedEvent event) {
for(ILabelProviderListener listener : listeners) {
listener.labelProviderChanged(event);
}
}
}