package moviescraper.doctord.view.renderer;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.SystemColor;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.border.EmptyBorder;
import org.apache.commons.io.FilenameUtils;
import org.imgscalr.Scalr;
import org.imgscalr.Scalr.Method;
import moviescraper.doctord.model.ImageCache;
import moviescraper.doctord.model.dataitem.Actor;
@SuppressWarnings("serial")
public class ActressListRenderer extends DefaultListCellRenderer {
private static final Font font = new Font("helvitica", Font.PLAIN, 12);
private static final Dimension maxActorSizeDimension = new Dimension (150,150);
List<File> currentlySelectedActorsFolderList;
public ActressListRenderer(List<File> currentlySelectedActorsFolderList) {
setBorder(new EmptyBorder(1, 1, 1, 1));
this.currentlySelectedActorsFolderList = currentlySelectedActorsFolderList;
}
@Override
public Component getListCellRendererComponent(JList<?> list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
if (value instanceof Actor) {
Actor actor = (Actor) value;
String role = actor.getRole();
if(role != null && role.length() > 0)
{
//two line version if thumbnail, otherwise show it one lines
if(actor.getThumb() != null && actor.getThumb().getThumbURL() != null)
value = "<html><body><b>" + actor.getName() + "</b><br> as <b>" + role + "</b></body></html>";
else
value = "<html><body><b>" + actor.getName() + "</b> as <b>" + role + "</b></body></html>";
}
else value = "<html><body><b> "+ actor.getName() + "</b>";
}
JLabel label = (JLabel) super.getListCellRendererComponent(list,
value, index, isSelected, cellHasFocus);
Object listElement = list.getModel().getElementAt(index);
if (listElement != null && listElement instanceof Actor && label.getIcon() == null) {
label.setIcon(getImageIconForLabelName((Actor)listElement));
}
label.setHorizontalTextPosition(JLabel.RIGHT);
label.setFont(font);
label.setBorder(BorderFactory.createLineBorder(Color.black));
if (index % 2 == 0) {
label.setBackground(SystemColor.controlShadow);
} else {
label.setBackground(SystemColor.controlHighlight);
}
return label;
}
/**
* Converts a given Image into a BufferedImage
*
* @param img The Image to be converted
* @return The converted BufferedImage
*/
private static BufferedImage toBufferedImage(Image img)
{
if (img instanceof BufferedImage)
{
return (BufferedImage) img;
}
// Create a buffered image with transparency
BufferedImage bimage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
// Draw the image on to the buffered image
Graphics2D bGr = bimage.createGraphics();
bGr.drawImage(img, 0, 0, null);
bGr.dispose();
// Return the buffered image
return bimage;
}
private ImageIcon resizeToMaxDimensions(Image image)
{
if(image.getWidth(null) > maxActorSizeDimension.width || image.getHeight(null) > maxActorSizeDimension.height)
return new ImageIcon(Scalr.resize(toBufferedImage(image), Method.QUALITY, maxActorSizeDimension.width, maxActorSizeDimension.height, Scalr.OP_ANTIALIAS));
else
return new ImageIcon(toBufferedImage(image));
}
//TODO: I should probably re-implement this to use Maps instead of arrays
private ImageIcon getImageIconForLabelName(Actor currentActor) {
if (currentActor.getThumb() != null)
{
//see if we can find a local copy in the .actors folder before trying to download, but only if the image is not already in memory
if(!currentActor.isThumbEdited() && currentlySelectedActorsFolderList != null && currentlySelectedActorsFolderList.size() > 0 && currentlySelectedActorsFolderList.get(0).isDirectory())
{
String currentActorNameAsPotentialFileName = currentActor.getName().replace(' ', '_');
File [] listFiles = currentlySelectedActorsFolderList.get(0).listFiles();
if(listFiles != null)
{
for(File currentFile : listFiles)
{
if(currentFile.isFile() && FilenameUtils.removeExtension(currentFile.getName()).equals(currentActorNameAsPotentialFileName)){
try {
return resizeToMaxDimensions(ImageCache.getImageFromCache(currentFile.toURI().toURL(), false, null));
} catch (MalformedURLException e) {
return new ImageIcon();
} catch (IOException e) {
return new ImageIcon();
}
}
}
}
if(currentActor.getThumb().getThumbURL() != null)
{
try {
return resizeToMaxDimensions(currentActor.getThumb().getThumbImage());
} catch (IOException e) {
return new ImageIcon();
}
}
}
else
{
try {
return resizeToMaxDimensions(currentActor.getThumb().getThumbImage());
} catch (IOException | NullPointerException e) {
currentActor.setThumbEdited(false);
return new ImageIcon();
}
}
}
return new ImageIcon();
}
}