/******************************************************************************* * Copyright (c) 2011, 2015 EclipseSource 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: * EclipseSource - initial API and implementation * Frank Appel - replaced singletons and static fields (Bug 337787) ******************************************************************************/ package org.eclipse.swt.internal.graphics; import static org.eclipse.rap.rwt.internal.service.ContextProvider.getApplicationContext; import java.io.InputStream; import org.eclipse.rap.rwt.RWT; import org.eclipse.rap.rwt.internal.util.ClassUtil; import org.eclipse.rap.rwt.internal.util.SharedInstanceBuffer; import org.eclipse.rap.rwt.internal.util.SharedInstanceBuffer.InstanceCreator; import org.eclipse.rap.rwt.internal.util.StreamUtil; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Image; public class ImageFactory { private final SharedInstanceBuffer<String,Image> cache; public static String getImagePath( Image image ) { String result = null; if( image != null ) { InternalImage internalImage = image.internalImage; String resourceName = internalImage.getResourceName(); if( internalImage.isExternal() ) { result = resourceName; } else { result = RWT.getResourceManager().getLocation( resourceName ); } } return result; } public ImageFactory() { cache = new SharedInstanceBuffer<String,Image>(); } public Image findImage( String path ) { return findImage( path, ImageFactory.class.getClassLoader() ); } public Image findImage( final String path, final ClassLoader imageLoader ) { return cache.get( path, new InstanceCreator<String, Image>() { public Image createInstance( String path ) { return createImage( path, imageLoader ); } } ); } public Image findImage( final String path, final InputStream inputStream ) { return cache.get( path, new InstanceCreator<String, Image>() { public Image createInstance( String path ) { return createImage( null, path, inputStream ); } } ); } private Image createImage( String path, ClassLoader imageLoader ) { Image result; InputStream inputStream = imageLoader.getResourceAsStream( path ); try { result = createImage( null, path, inputStream ); } finally { if( inputStream != null ) { StreamUtil.close( inputStream ); } } return result; } public Image createImage( Device device, String key, InputStream inputStream ) { InternalImageFactory internalImageFactory = getApplicationContext().getInternalImageFactory(); InternalImage internalImage = internalImageFactory.findInternalImage( key, inputStream ); return createImageInstance( device, internalImage ); } static Image createImageInstance( Device device, InternalImage internalImage ) { Class[] paramTypes = new Class[] { Device.class, InternalImage.class }; Object[] paramValues = new Object[] { device, internalImage }; return ClassUtil.newInstance( Image.class, paramTypes, paramValues ); } }