// Copyright (c) 2003-2005 by Leif Frenzel - see http://leiffrenzel.de package net.sf.eclipsefp.haskell.ui.util; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import net.sf.eclipsefp.haskell.ui.HaskellUIPlugin; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; /** </p>A registry that maps <code>ImageDescriptors</code> to * <code>Image</code>.</p> * * @author Leif Frenzel */ class ImageDescriptorRegistry { private final Map<ImageDescriptor, Image> registry; private final Display display; /** <p>creates a new image descriptor registry for the given display. * All images managed by this registry will be disposed when the display * gets disposed.</p> */ public ImageDescriptorRegistry() { this.registry = new HashMap<>(); this.display = HaskellUIPlugin.getStandardDisplay(); hookDisplay(); } public Image get( final ImageDescriptor descriptor ) { ImageDescriptor desc = descriptor; if( desc == null ) { desc = ImageDescriptor.getMissingImageDescriptor(); } Image result = registry.get( desc ); if( result == null ) { Assert.isTrue( display == HaskellUIPlugin.getStandardDisplay(), "Allocating image for wrong display." ); //$NON-NLS-1$ result = desc.createImage(); if( result != null ) { registry.put( desc, result ); } } return result; } public void dispose() { Iterator<Image> iter = registry.values().iterator(); while( iter.hasNext() ) { iter.next().dispose(); } registry.clear(); } // helping methods ////////////////// private void hookDisplay() { display.disposeExec( new Runnable() { @Override public void run() { dispose(); } } ); } }