org.axdt.core.ui.img.AxdtImageHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.axdt.core.ui.img.AxdtImageHelper.java

Source

/*******************************************************************************
 * Copyright (c) 2010 Martin Schnabel <mb0@mb0.org>.
 * 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
 ******************************************************************************/
package org.axdt.core.ui.img;

import java.net.URL;
import java.util.Iterator;
import java.util.Map;

import org.axdt.core.ui.CoreUiActivator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.BundleListener;

import com.google.common.collect.Maps;

/**
 * @author mb0
 */
public class AxdtImageHelper implements BundleListener, AxdtImages {
    private static AxdtImageHelper instance;

    private final AbstractUIPlugin plugin;
    private final String pathSuffix = "icons/";
    private final Map<ImageDescriptor, Image> registry = Maps.newHashMap();

    public static AxdtImageHelper getInstance() {
        if (instance == null)
            instance = new AxdtImageHelper();
        return instance;
    }

    private AxdtImageHelper() {
        plugin = CoreUiActivator.getPlugin();
        plugin.getBundle().getBundleContext().addBundleListener(this);
    }

    public Image getImage(ImageDescriptor descriptor) {
        if (descriptor == null) {
            descriptor = ImageDescriptor.getMissingImageDescriptor();
        }
        Image result = registry.get(descriptor);
        if (result != null) {
            return result;
        }
        result = descriptor.createImage();
        if (result != null) {
            Image existing = registry.put(descriptor, result);
            if (existing != null) {
                existing.dispose();
            }
        }
        return result;
    }

    public void dispose() {
        // in case another plug-in stop triggered the disposal
        plugin.getBundle().getBundleContext().removeBundleListener(this);
        synchronized (registry) {
            for (Iterator<Image> iter = registry.values().iterator(); iter.hasNext();) {
                Image image = iter.next();
                image.dispose();
            }
            registry.clear();
        }
    }

    public Image getImage(String imageName) {
        String imgname = imageName == null ? DEFAULT : imageName;
        if (imgname != null) {
            Image result = null;
            URL imgUrl = plugin.getBundle().getEntry(pathSuffix + imgname);
            if (imgUrl != null) {
                ImageDescriptor id = null;
                result = plugin.getImageRegistry().get(imgUrl.toExternalForm());
                if (result == null) {
                    id = ImageDescriptor.createFromURL(imgUrl);
                    if (id != null) {
                        result = id.createImage();
                        plugin.getImageRegistry().put(imgUrl.toExternalForm(), result);
                    }
                }
                return result;
            }
            if (!imgname.equals(NOT_FOUND)) {
                return getImage(NOT_FOUND);
            }
        }
        return null;
    }

    public void bundleChanged(BundleEvent event) {
        if (event.getType() == BundleEvent.STOPPED) {
            dispose();
        }
    }
}