org.eclipse.wb.internal.rcp.model.util.InternalImageManager.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.wb.internal.rcp.model.util.InternalImageManager.java

Source

/*******************************************************************************
 * Copyright (c) 2011 Google, Inc.
 * 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:
 *    Google, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.wb.internal.rcp.model.util;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * Utility class for managing OS resources associated with SWT/JFace images. Used to manage images
 * which are loaded from the users {@code Activator}.
 * 
 * @author lobas_av
 * @coverage rcp.util
 */
@SuppressWarnings("unchecked")
public final class InternalImageManager {
    private static final Map/*<String, Image>*/ IMAGES = new HashMap();
    private static final Map/*<String, Image>*/ DESCRIPTORS = new HashMap();

    ////////////////////////////////////////////////////////////////////////////
    //
    // Access
    //
    ////////////////////////////////////////////////////////////////////////////
    /**
     * @return {@link ImageDescriptor} the image descriptor stored in the file at the specified path.
     */
    public static ImageDescriptor getImageDescriptor(String projectPath, String imagePath) {
        // prepare descriptor
        imagePath = configurePath(imagePath);
        ImageDescriptor descriptor = (ImageDescriptor) DESCRIPTORS.get(imagePath);
        // check create descriptor
        if (descriptor == null) {
            // prepare file path
            String fullDescriptorPath = findFile(projectPath, imagePath);
            if (fullDescriptorPath != null) {
                // create descriptor
                descriptor = ImageDescriptor.createFromFile(null, fullDescriptorPath);
                DESCRIPTORS.put(imagePath, descriptor);
            }
        }
        return descriptor;
    }

    /**
     * @return {@link Image} the image stored in the file at the specified path.
     */
    public static Image getImage(String projectPath, String imagePath) {
        // prepare image
        imagePath = configurePath(imagePath);
        Image image = (Image) IMAGES.get(imagePath);
        // check create image
        if (image == null) {
            // prepare file path
            String fullImagePath = findFile(projectPath, imagePath);
            if (fullImagePath != null) {
                // create image
                try {
                    image = new Image(null, fullImagePath);
                } catch (Throwable e) {
                    return null;
                }
                IMAGES.put(imagePath, image);
            }
        }
        return image;
    }

    /**
     * Dispose of cached objects and their underlying OS resources.
     */
    public static void dispose() {
        for (Iterator /*Image*/I = IMAGES.values().iterator(); I.hasNext();) {
            Image image = (Image) I.next();
            try {
                if (!image.isDisposed()) {
                    image.dispose();
                }
            } catch (Throwable e) {
            }
        }
        IMAGES.clear();
        DESCRIPTORS.clear();
    }

    ////////////////////////////////////////////////////////////////////////////
    //
    // Utils
    //
    ////////////////////////////////////////////////////////////////////////////
    /**
     * @return the configured path.
     */
    private static String configurePath(String path) {
        // check wrong path
        if (path == null || path.length() == 0) {
            return "";
        }
        // replace slashes
        path = path.replace('\\', '/');
        if (path.charAt(0) == '/') {
            path = path.substring(1);
        }
        return path;
    }

    /**
     * @return the full path to file or {@code null} if file is not exist.
     */
    private static String findFile(String projectPath, String imagePath) {
        // direct link
        String fullPath = projectPath + "/" + imagePath;
        if (new File(fullPath).exists()) {
            return fullPath;
        }
        // with popular prefix 'icons'
        fullPath = projectPath + "/icons/" + imagePath;
        if (new File(fullPath).exists()) {
            return fullPath;
        }
        // with popular prefix 'images'
        fullPath = projectPath + "/images/" + imagePath;
        if (new File(fullPath).exists()) {
            return fullPath;
        }
        // not found
        return null;
    }
}