filebot/source/net/sourceforge/filebot/ui/panel/rename/RenameListCellRenderer.java

154 lines
4.3 KiB
Java

package net.sourceforge.filebot.ui.panel.rename;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import java.io.File;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import net.miginfocom.swing.MigLayout;
import net.sourceforge.filebot.ResourceManager;
import net.sourceforge.filebot.ui.panel.rename.RenameModel.FormattedFuture;
import net.sourceforge.tuned.FileUtilities;
import net.sourceforge.tuned.ui.DefaultFancyListCellRenderer;
import net.sourceforge.tuned.ui.GradientStyle;
class RenameListCellRenderer extends DefaultFancyListCellRenderer {
private final RenameModel renameModel;
private final TypeRenderer typeRenderer = new TypeRenderer();
private final Color noMatchGradientBeginColor = new Color(0xB7B7B7);
private final Color noMatchGradientEndColor = new Color(0x9A9A9A);
public RenameListCellRenderer(RenameModel renameModel) {
this.renameModel = renameModel;
setHighlightingEnabled(false);
setLayout(new MigLayout("insets 0, fill", "align left", "align center"));
add(typeRenderer, "gap rel:push, hidemode 3");
}
@Override
public void configureListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.configureListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
// reset decoration
setIcon(null);
typeRenderer.setVisible(false);
typeRenderer.setAlpha(1.0f);
if (value instanceof File) {
// display file extension
File file = (File) value;
if (renameModel.preserveExtension()) {
setText(FileUtilities.getName(file));
typeRenderer.setText(getType(file));
typeRenderer.setVisible(true);
} else {
setText(file.getName());
}
} else if (value instanceof FormattedFuture) {
// display progress icon
FormattedFuture future = (FormattedFuture) value;
switch (future.getState()) {
case PENDING:
setIcon(ResourceManager.getIcon("worker.pending"));
break;
case STARTED:
setIcon(ResourceManager.getIcon("worker.started"));
break;
}
}
if (!renameModel.hasComplement(index)) {
if (isSelected) {
setGradientColors(noMatchGradientBeginColor, noMatchGradientEndColor);
} else {
setForeground(noMatchGradientBeginColor);
typeRenderer.setAlpha(0.5f);
}
}
}
protected String getType(File file) {
if (file.isDirectory())
return "Folder";
String extension = FileUtilities.getExtension(file);
if (extension != null)
return extension;
// some file with no extension
return "File";
}
private static class TypeRenderer extends DefaultListCellRenderer {
private final Insets margin = new Insets(0, 10, 0, 0);
private final Insets padding = new Insets(0, 6, 0, 5);
private final int arc = 10;
private Color gradientBeginColor = new Color(0xFFCC00);
private Color gradientEndColor = new Color(0xFF9900);
private float alpha = 1.0f;
public TypeRenderer() {
setOpaque(false);
setForeground(new Color(0x141414));
setBorder(new CompoundBorder(new EmptyBorder(margin), new EmptyBorder(padding)));
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
RoundRectangle2D shape = new RoundRectangle2D.Float(margin.left, margin.top, getWidth() - (margin.left + margin.right), getHeight(), arc, arc);
g2d.setComposite(AlphaComposite.SrcOver.derive(alpha));
g2d.setPaint(GradientStyle.TOP_TO_BOTTOM.getGradientPaint(shape, gradientBeginColor, gradientEndColor));
g2d.fill(shape);
g2d.setFont(getFont());
g2d.setPaint(getForeground());
Rectangle2D textBounds = g2d.getFontMetrics().getStringBounds(getText(), g2d);
g2d.drawString(getText(), (float) (shape.getCenterX() - textBounds.getX() - (textBounds.getWidth() / 2f)), (float) (shape.getCenterY() - textBounds.getY() - (textBounds.getHeight() / 2)));
}
public void setAlpha(float alpha) {
this.alpha = alpha;
}
}
}