/*
* Copyright 2010-2015 Institut Pasteur.
*
* This file is part of Icy.
*
* Icy is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Icy 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Icy. If not, see <http://www.gnu.org/licenses/>.
*/
package icy.gui.component;
import icy.image.ImageUtil;
import icy.resource.ResourceUtil;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
/**
* @author stephane
*/
public class ImageComponent extends JPanel
{
/**
*
*/
private static final long serialVersionUID = 1448746815524070306L;
private Image image;
private BufferedImage cachedImage;
protected boolean forceUpdateCache;
/**
* @deprecated Use {@link #ImageComponent(Image)} instead
*/
@Deprecated
public ImageComponent(Image image, Dimension d)
{
this(image);
}
/**
* @deprecated Use {@link #ImageComponent(Image)} instead
*/
@Deprecated
public ImageComponent(Image image, int width, int height)
{
this(image);
}
/**
* @param image
*/
public ImageComponent(Image image)
{
super(true);
this.image = image;
if (image != null)
{
// be sure image data are ready
ImageUtil.waitImageReady(image);
setPreferredSize(new Dimension(image.getWidth(null), image.getHeight(null)));
}
forceUpdateCache = true;
}
public ImageComponent()
{
this(null);
}
/**
* @return the image
*/
public Image getImage()
{
return image;
}
/**
* @param image
* the image to set
*/
public void setImage(Image image)
{
if (this.image != image)
{
this.image = image;
forceUpdateCache = true;
repaint();
}
}
protected void updateCache()
{
cachedImage = null;
if (image == null)
return;
// be sure image data are ready
ImageUtil.waitImageReady(image);
float ix = image.getWidth(null);
float iy = image.getHeight(null);
// something wrong here --> use 'fault' image
if ((ix <= 0f) || (iy <= 0f))
{
image = ResourceUtil.ICON_DELETE;
ix = image.getWidth(null);
iy = image.getHeight(null);
}
// we want a minimal appearance of 100,100
final float w = Math.max(getWidth(), 100);
final float h = Math.max(getHeight(), 100);
if ((w > 0f) && (h > 0f))
{
final float sx = w / ix;
final float sy = h / iy;
final float s = Math.min(sx, sy);
final int nix = (int) (ix * s);
final int niy = (int) (iy * s);
if ((nix > 0) && (niy > 0))
{
// need to rebuild cached image ?
if (forceUpdateCache || (cachedImage == null) || (nix != cachedImage.getWidth())
|| (niy != cachedImage.getHeight()))
{
cachedImage = ImageUtil.scaleQuality(image, nix, niy);
forceUpdateCache = false;
}
}
}
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
updateCache();
if (cachedImage != null)
g.drawImage(cachedImage, (getWidth() - cachedImage.getWidth()) / 2,
(getHeight() - cachedImage.getHeight()) / 2, null);
}
}