org.eclipse.jpt.common.ui.internal.jface.ResourceManagerTableLabelProvider.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jpt.common.ui.internal.jface.ResourceManagerTableLabelProvider.java

Source

/*******************************************************************************
 * Copyright (c) 2012 Oracle. 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:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.common.ui.internal.jface;

import java.io.Serializable;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.resource.ResourceManager;
import org.eclipse.jpt.common.utility.internal.ObjectTools;
import org.eclipse.swt.graphics.Image;

/**
 * A table label provider that returns the value returned by the
 * {@link #textTransformer text transformer} for an element's text and
 * the value returned by the
 * {@link #imageDescriptorTransformer image descriptor transformer} to
 * retrieve the element's image from a {@link ResourceManager resource manager}.
 * The label provider uses a local {@link ResourceManager}
 * to allocate the label images. This resource manager will be disposed
 * when the label provider is disposed.
 * 
 * @param <E> the type of the objects passed to the label provider
 */
public class ResourceManagerTableLabelProvider<E> extends PluggableTextTableLabelProvider<E> {
    private volatile ImageDescriptorTransformer<E> imageDescriptorTransformer;
    private final ResourceManager resourceManager;

    /**
     * Construct a table label provider that uses the
     * {@link JFaceResources#getResources() default JFace resource manager}
     * to allocate the label images.
     * @see #setImageDescriptorTransformer(ImageDescriptorTransformer)
     * @see #setTextTransformer(TextTransformer)
     */
    public ResourceManagerTableLabelProvider() {
        this(JFaceResources.getResources());
    }

    /**
     * Construct a table label provider that uses the specified resource manager to
     * allocate the label images.
     * @see #setImageDescriptorTransformer(ImageDescriptorTransformer)
     * @see #setTextTransformer(TextTransformer)
     */
    public ResourceManagerTableLabelProvider(ResourceManager resourceManager) {
        this(DefaultImageDescriptorTransformer.<E>instance(), resourceManager);
    }

    /**
     * Construct a table label provider that returns an element's
     * {@link Object#toString() toString()} value for its text and
     * the value returned by the specified image descriptor transformer to
     * retrieve the element's image from the specified resource manager.
     * @see #setTextTransformer(TextTransformer)
     */
    public ResourceManagerTableLabelProvider(ImageDescriptorTransformer<E> imageDescriptorTransformer,
            ResourceManager resourceManager) {
        this(imageDescriptorTransformer, DefaultTextTransformer.<E>instance(), resourceManager);
    }

    /**
     * Construct a table label provider that returns the value returned by the
     * specified text transformer for an element's text and
     * the value returned by the specified image descriptor transformer to
     * retrieve the element's image from the specified resource manager.
     */
    public ResourceManagerTableLabelProvider(ImageDescriptorTransformer<E> imageDescriptorTransformer,
            TextTransformer<E> textTransformer, ResourceManager resourceManager) {
        super(textTransformer);
        if ((imageDescriptorTransformer == null) || (resourceManager == null)) {
            throw new NullPointerException();
        }
        this.imageDescriptorTransformer = imageDescriptorTransformer;
        this.resourceManager = new LocalResourceManager(resourceManager);
    }

    /**
     * @exception ClassCastException if the element is not the same type as the
     * {@link ImageDescriptorTransformer image descriptor transformer}'s
     * generic type argument {@code <T1>}.
     */
    @Override
    public Image getColumnImage(Object element, int columnIndex) {
        ImageDescriptor imageDescriptor = this.getColumnImageDescriptor(element, columnIndex);
        return (imageDescriptor == null) ? null : this.resourceManager.createImage(imageDescriptor);
    }

    @SuppressWarnings("unchecked")
    private ImageDescriptor getColumnImageDescriptor(Object element, int columnIndex) {
        return this.imageDescriptorTransformer.transform((E) element, columnIndex);
    }

    public void setImageDescriptorTransformer(ImageDescriptorTransformer<E> imageDescriptorTransformer) {
        if (imageDescriptorTransformer == null) {
            throw new NullPointerException();
        }
        this.imageDescriptorTransformer = imageDescriptorTransformer;
    }

    @Override
    public void dispose() {
        this.resourceManager.dispose();
        super.dispose();
    }

    // ********** transformers **********

    public interface ImageDescriptorTransformer<E> extends Transformer<E, ImageDescriptor> {
        ImageDescriptor transform(E element, int columnIndex);
    }

    public static class DefaultImageDescriptorTransformer<E>
            implements ImageDescriptorTransformer<E>, Serializable {
        @SuppressWarnings("rawtypes")
        public static final ImageDescriptorTransformer<?> INSTANCE = new DefaultImageDescriptorTransformer();

        @SuppressWarnings("unchecked")
        public static <R> ImageDescriptorTransformer<R> instance() {
            return (ImageDescriptorTransformer<R>) INSTANCE;
        }

        // ensure single instance
        private DefaultImageDescriptorTransformer() {
            super();
        }

        public ImageDescriptor transform(E element, int columnIndex) {
            return null;
        }

        @Override
        public String toString() {
            return ObjectTools.toString(this);
        }

        private static final long serialVersionUID = 1L;

        private Object readResolve() {
            // replace this object with the singleton
            return INSTANCE;
        }
    }
}