/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.sdkuilib.internal.repository.icons; import com.android.sdklib.internal.repository.Archive; import com.android.sdklib.internal.repository.Package; import com.android.sdklib.internal.repository.SdkSource; import com.android.sdklib.internal.repository.SdkSourceCategory; import com.android.sdkuilib.internal.repository.RepoSourcesAdapter; import org.eclipse.swt.SWTException; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import java.io.InputStream; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * An utility class to serve {@link Image} correspond to the various icons * present in this package and dispose of them correctly at the end. */ public class ImageFactory { private final Display mDisplay; private final Map<String, Image> mImages = new HashMap<String, Image>(); public ImageFactory(Display display) { mDisplay = display; } /** * Loads an image given its filename (with its extension). * Might return null if the image cannot be loaded. * The image is cached. Successive calls will return the <em>same</em> object. * * @param imageName The filename (with extension) of the image to load. * @return A new or existing {@link Image}. The caller must NOT dispose the image (the * image will disposed by {@link #dispose()}). The returned image can be null if the * expected file is missing. */ public Image getImageByName(String imageName) { Image image = mImages.get(imageName); if (image != null) { return image; } InputStream stream = getClass().getResourceAsStream(imageName); if (stream != null) { try { image = new Image(mDisplay, stream); } catch (SWTException e) { // ignore } catch (IllegalArgumentException e) { // ignore } } // Store the image in the hash, even if this failed. If it fails now, it will fail later. mImages.put(imageName, image); return image; } /** * Loads and returns the appropriate image for a given package, archive or source object. * The image is cached. Successive calls will return the <em>same</em> object. * * @param object A {@link SdkSource} or {@link Package} or {@link Archive}. * @return A new or existing {@link Image}. The caller must NOT dispose the image (the * image will disposed by {@link #dispose()}). The returned image can be null if the * object is of an unknown type. */ public Image getImageForObject(Object object) { if (object == null) { return null; } String clz = object.getClass().getSimpleName(); if (clz.endsWith(Package.class.getSimpleName())) { String name = clz.replaceFirst(Package.class.getSimpleName(), "").toLowerCase() + //$NON-NLS-1$ "_pkg_16.png"; //$NON-NLS-1$ return getImageByName(name); } if (object instanceof SdkSourceCategory) { return getImageByName("source_cat_icon16.png"); //$NON-NLS-1$ } else if (object instanceof SdkSource) { return getImageByName("source_icon16.png"); //$NON-NLS-1$ } else if (object instanceof RepoSourcesAdapter.RepoSourceError) { return getImageByName("error_icon16.png"); //$NON-NLS-1$ } else if (object instanceof RepoSourcesAdapter.RepoSourceEmpty) { return getImageByName("nopkg_icon16.png"); //$NON-NLS-1$ } if (object instanceof Archive) { if (((Archive) object).isCompatible()) { return getImageByName("archive_icon16.png"); //$NON-NLS-1$ } else { return getImageByName("incompat_icon16.png"); //$NON-NLS-1$ } } return null; } /** * Dispose all the images created by this factory so far. */ public void dispose() { Iterator<Image> it = mImages.values().iterator(); while(it.hasNext()) { Image img = it.next(); if (img != null && img.isDisposed() == false) { img.dispose(); } it.remove(); } } }