/*
* Copyright (C) 2012 IsmAvatar <IsmAvatar@gmail.com>
* Copyright (C) 2007 Clam <clamisgood@gmail.com>
*
* This file is part of LibMaker.
* LibMaker is free software and comes with ABSOLUTELY NO WARRANTY.
* See LICENSE for details.
*/
package org.lateralgm.libmaker.file;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import org.lateralgm.libmaker.Messages;
import org.lateralgm.libmaker.components.ErrorDialog;
import org.lateralgm.libmaker.file.FileChooser.CustomFileChooser;
import org.lateralgm.libmaker.file.FileChooser.CustomFileFilter;
public final class ImageChooser
{
private static CustomFileChooser imageFc = null;
public static File chooseImageFile(Component parent)
{
if (imageFc == null)
{
imageFc = new CustomFileChooser("/org/lateralgm/libmaker","LAST_IMAGE_DIR"); //$NON-NLS-1$ //$NON-NLS-2$
imageFc.setAccessory(new Accessory(imageFc));
String[] exts = ImageIO.getReaderFileSuffixes();
for (int i = 0; i < exts.length; i++)
exts[i] = "." + exts[i]; //$NON-NLS-1$
String allSpiImages = Messages.getString("Util.ALL_SPI_IMAGES"); //$NON-NLS-1$
CustomFileFilter filt = new CustomFileFilter(allSpiImages,exts);
imageFc.addChoosableFileFilter(filt);
for (String element : exts)
{
imageFc.addChoosableFileFilter(new CustomFileFilter(Messages.format("Util.FILES", //$NON-NLS-1$
element),element));
}
imageFc.setFileFilter(filt);
}
if (imageFc.showOpenDialog(parent) == JFileChooser.APPROVE_OPTION)
return imageFc.getSelectedFile();
return null;
}
public static BufferedImage getValidImage(Frame parent)
{
File f = chooseImageFile(parent);
if (f == null) return null;
try
{
return ImageIO.read(f);
}
catch (IOException e)
{
new ErrorDialog(parent,Messages.getString("Util.ERROR_TITLE"), //$NON-NLS-1$
Messages.format("Util.ERROR_LOADING",f),e).setVisible(true); //$NON-NLS-1$
}
return null;
}
private ImageChooser()
{
}
public static class Accessory extends JLabel implements PropertyChangeListener
{
private static final long serialVersionUID = 1L;
private ImageIcon prev = null;
private static final int WIDTH = 150;
private static final int HEIGHT = 150;
public Accessory(JFileChooser choose)
{
choose.addPropertyChangeListener(this);
setPreferredSize(new Dimension(WIDTH,HEIGHT));
setHorizontalAlignment(SwingConstants.CENTER);
}
public static ImageIcon getScaledIcon(BufferedImage img, int width, int height)
{
if (img.getWidth() > width && img.getHeight() > height)
return new ImageIcon(img.getScaledInstance(img.getWidth() >= img.getHeight() ? width : -1,
img.getHeight() > img.getWidth() ? height : -1,Image.SCALE_FAST));
if (img.getWidth() > width || img.getHeight() > height)
return new ImageIcon(img.getScaledInstance(img.getWidth() > width ? width : -1,
img.getHeight() > height ? height : -1,Image.SCALE_FAST));
return new ImageIcon(img);
}
public void propertyChange(PropertyChangeEvent e)
{
if (e.getPropertyName() != JFileChooser.SELECTED_FILE_CHANGED_PROPERTY || !isShowing())
return;
File f = (File) e.getNewValue();
if (f == null)
prev = null;
else
{
BufferedImage img = null;
try
{
img = ImageIO.read(f); //can return null
}
catch (Throwable t)
{
//img = null
}
prev = img == null ? null : getScaledIcon(img,WIDTH,HEIGHT);
}
setIcon(prev);
}
}
}