org.eclipse.ecf.internal.ui.wizards.WorkbenchLabelProvider.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ecf.internal.ui.wizards.WorkbenchLabelProvider.java

Source

/*******************************************************************************
 * 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;
    }
}