blob: 89946cce96a7e292a4d1a0cb936b385861c03482 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ecf.internal.ui.wizards;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.IFontProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.model.IWorkbenchAdapter;
import org.eclipse.ui.model.IWorkbenchAdapter2;
/**
* Provides basic labels for adaptable objects that have the
* <code>IWorkbenchAdapter</code> adapter associated with them. All dispensed
* images are cached until the label provider is explicitly rootDisposed. This
* class provides a facility for subclasses to define annotations on the labels
* and icons of adaptable objects.
*/
public class WorkbenchLabelProvider extends LabelProvider implements
IColorProvider, IFontProvider {
/**
* Returns a workbench label provider that is hooked up to the decorator
* mechanism.
*
* @return a new <code>DecoratingLabelProvider</code> which wraps a <code>
* new <code>WorkbenchLabelProvider</code>
*/
public static ILabelProvider getDecoratingWorkbenchLabelProvider() {
return new DecoratingLabelProvider(new WorkbenchLabelProvider(),
PlatformUI.getWorkbench().getDecoratorManager()
.getLabelDecorator());
}
/**
* Listener that tracks changes to the editor registry and does a full
* update when it changes, since many workbench adapters derive their icon
* from the file associations in the registry.
*/
private IPropertyListener editorRegistryListener = new IPropertyListener() {
public void propertyChanged(Object source, int propId) {
if (propId == IEditorRegistry.PROP_CONTENTS) {
fireLabelProviderChanged(new LabelProviderChangedEvent(
WorkbenchLabelProvider.this));
}
}
};
/**
* Creates a new workbench label provider.
*/
public WorkbenchLabelProvider() {
PlatformUI.getWorkbench().getEditorRegistry().addPropertyListener(
editorRegistryListener);
}
/**
* Returns an image descriptor that is based on the given descriptor, but
* decorated with additional information relating to the state of the
* provided object.
*
* Subclasses may reimplement this method to decorate an object's image.
*
* @param input
* The base image to decorate.
* @param element
* The element used to look up decorations.
* @return the resuling ImageDescriptor.
* @see org.eclipse.jface.resource.CompositeImageDescriptor
*/
protected ImageDescriptor decorateImage(ImageDescriptor input,
Object element) {
return input;
}
/**
* Returns a label that is based on the given label, but decorated with
* additional information relating to the state of the provided object.
*
* Subclasses may implement this method to decorate an object's label.
*
* @param input
* The base text to decorate.
* @param element
* The element used to look up decorations.
* @return the resulting text
*/
protected String decorateText(String input, Object element) {
return input;
}
/*
* (non-Javadoc) Method declared on ILabelProvider
*/
public void dispose() {
PlatformUI.getWorkbench().getEditorRegistry().removePropertyListener(
editorRegistryListener);
super.dispose();
}
protected static final Object getAdapterUtil(Object sourceObject,
Class adapterType) {
Assert.isNotNull(adapterType);
if (sourceObject == null)
return null;
if (adapterType.isInstance(sourceObject))
return sourceObject;
if (sourceObject instanceof IAdaptable) {
IAdaptable adaptable = (IAdaptable) sourceObject;
Object result = adaptable.getAdapter(adapterType);
if (result != null) {
// Sanity-check
Assert.isTrue(adapterType.isInstance(result));
return result;
}
}
if (!(sourceObject instanceof PlatformObject)) {
Object result = Platform.getAdapterManager().getAdapter(
sourceObject, adapterType);
if (result != null)
return result;
}
return null;
}
/**
* Returns the implementation of IWorkbenchAdapter for the given object.
*
* @param o
* the object to look up.
* @return IWorkbenchAdapter or<code>null</code> if the adapter is not
* defined or the object is not adaptable.
*/
protected final IWorkbenchAdapter getAdapter(Object o) {
return (IWorkbenchAdapter) getAdapterUtil(o, IWorkbenchAdapter.class);
}
/**
* Returns the implementation of IWorkbenchAdapter2 for the given object.
*
* @param o
* the object to look up.
* @return IWorkbenchAdapter2 or<code>null</code> if the adapter is not
* defined or the object is not adaptable.
*/
protected final IWorkbenchAdapter2 getAdapter2(Object o) {
return (IWorkbenchAdapter2) getAdapterUtil(o, IWorkbenchAdapter2.class);
}
/*
* (non-Javadoc) Method declared on ILabelProvider
*/
public final Image getImage(Object element) {
// obtain the base image by querying the element
IWorkbenchAdapter adapter = getAdapter(element);
if (adapter == null)
return null;
ImageDescriptor descriptor = adapter.getImageDescriptor(element);
if (descriptor == null)
return null;
// add any annotations to the image descriptor
descriptor = decorateImage(descriptor, element);
/*
* Image image = (Image)
* SWTResourceUtil.getImageTable().get(descriptor); if (image == null) {
* image = descriptor.createImage();
* SWTResourceUtil.getImageTable().put(descriptor, image); }
*/
Image image = descriptor.createImage();
return image;
}
/*
* (non-Javadoc) Method declared on ILabelProvider
*/
public final String getText(Object element) {
// query the element for its label
IWorkbenchAdapter adapter = getAdapter(element);
if (adapter == null)
return ""; //$NON-NLS-1$
String label = adapter.getLabel(element);
// return the decorated label
return decorateText(label, element);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
*/
public Color getForeground(Object element) {
return getColor(element, true);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
*/
public Color getBackground(Object element) {
return getColor(element, false);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
*/
public Font getFont(Object element) {
IWorkbenchAdapter2 adapter = getAdapter2(element);
if (adapter == null)
return null;
FontData descriptor = adapter.getFont(element);
if (descriptor == null)
return null;
/*
* Font font = (Font) SWTResourceUtil.getFontTable().get(descriptor); if
* (font == null) { font = new Font(Display.getCurrent(), descriptor);
* SWTResourceUtil.getFontTable().put(descriptor, font); }
*/
Font font = new Font(Display.getCurrent(), descriptor);
return font;
}
private Color getColor(Object element, boolean forground) {
IWorkbenchAdapter2 adapter = getAdapter2(element);
if (adapter == null)
return null;
RGB descriptor = forground ? adapter.getForeground(element) : adapter
.getBackground(element);
if (descriptor == null)
return null;
/*
* Color color = (Color)
* SWTResourceUtil.getColorTable().get(descriptor); if (color == null) {
* color = new Color(Display.getCurrent(), descriptor);
* SWTResourceUtil.getColorTable().put(descriptor, color); }
*/
Color color = new Color(Display.getCurrent(), descriptor);
return color;
}
}