net.sourceforge.sqlexplorer.util.ImageUtil.java Source code

Java tutorial

Introduction

Here is the source code for net.sourceforge.sqlexplorer.util.ImageUtil.java

Source

/*
 * Copyright (C) 2007 SQL Explorer Development Team http://sourceforge.net/projects/eclipsesql
 * 
 * This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General
 * Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 * 
 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to
 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */
package net.sourceforge.sqlexplorer.util;

import java.net.URL;
import java.util.HashMap;

import net.sourceforge.sqlexplorer.Messages;
import net.sourceforge.sqlexplorer.plugin.SQLExplorerPlugin;

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

public class ImageUtil {

    private static HashMap _imageCount = new HashMap();

    private static HashMap _images = new HashMap();

    /**
     * Dispose of an image in cache. Once there are no more open handles to the image it will be disposed of.
     * 
     */
    public static void disposeImage(String propertyName) {

        try {
            Image image = (Image) _images.get(propertyName);

            if (image == null) {
                return;
            }

            Integer handleCount = (Integer) _imageCount.get(propertyName);

            if (handleCount == null || handleCount == 0) {
                image.dispose();
                _images.remove(propertyName);
                _imageCount.remove(propertyName);
            } else {
                handleCount = new Integer(handleCount.intValue() - 1);
                _imageCount.put(propertyName, handleCount);
            }

        } catch (Throwable e) {
            SQLExplorerPlugin.error("Error disposing images", e);
        }
    }

    /**
     * Create an image descriptor for the given image property in the text.properties file.
     * 
     * @param propertyName
     * @return
     */
    public static ImageDescriptor getDescriptor(String propertyName) {

        try {

            if (propertyName == null) {
                return null;
            }

            // get image path
            String path = Messages.getString(propertyName);

            if (path == null || path.trim().length() == 0) {
                SQLExplorerPlugin.error("Missing image path for " + propertyName, null);
                return null;
            }

            // create image
            URL url = URLUtil.getResourceURL(path);
            return ImageDescriptor.createFromURL(url);

        } catch (Exception e) {
            SQLExplorerPlugin.error("Couldn't create image for " + propertyName, e);
            return null;
        }

    }

    public static ImageDescriptor getFragmentDescriptor(String fragmentId, String path) {

        try {

            if (path == null || path.trim().length() == 0) {
                return null;
            }

            // create image
            URL url = URLUtil.getFragmentResourceURL(fragmentId, path);
            return ImageDescriptor.createFromURL(url);

        } catch (Exception e) {
            SQLExplorerPlugin.error("Couldn't create image for " + fragmentId + ": " + path, e);
            return null;
        }

    }

    /**
     * Get an image object from cache or create one if it doesn't exist yet. Everytime an object is retrieved, it should
     * be disposed of using the ImageUtil.disposeImage method.
     * 
     * @param propertyName
     */
    public static Image getImage(String propertyName) {

        Image image = (Image) _images.get(propertyName);

        if (image == null) {
            image = getDescriptor(propertyName).createImage();

            if (image == null) {
                return null;
            }

            _images.put(propertyName, image);
        }

        // increase image handle count by one

        Integer handleCount = (Integer) _imageCount.get(propertyName);

        if (handleCount == null) {
            handleCount = new Integer(1);
        } else {
            handleCount = new Integer(handleCount.intValue() + 1);
        }
        _imageCount.put(propertyName, handleCount);

        return image;
    }

    public static Image getFragmentImage(String fragmentId, String path) {

        if (fragmentId.length() > 28) {
            fragmentId = fragmentId.substring(0, fragmentId.lastIndexOf('.'));
        }
        try {

            if (path == null || path.trim().length() == 0) {
                return null;
            }

            // create image
            URL url = URLUtil.getFragmentResourceURL(fragmentId, path);
            ImageDescriptor descriptor = ImageDescriptor.createFromURL(url);
            if (descriptor == null) {
                return null;
            }
            return descriptor.createImage();

        } catch (Exception e) {
            SQLExplorerPlugin.error("Couldn't create image for " + fragmentId + ": " + path, e);
            return null;
        }
    }
}