* improved dnd behavour

* refactoring
This commit is contained in:
Reinhard Pointner 2008-03-22 21:12:34 +00:00
parent 824c29fd36
commit 6d2ff4dfe4
23 changed files with 509 additions and 387 deletions

View File

@ -66,7 +66,7 @@ public class FileBotUtil {
public static boolean containsOnlyTorrentFiles(List<File> files) {
for (File file : files) {
if (!file.isFile() || !FileFormat.getExtension(file).equalsIgnoreCase("torrent"))
if (!FileFormat.hasExtension(file, "torrent"))
return false;
}
@ -76,7 +76,7 @@ public class FileBotUtil {
public static boolean containsOnlySfvFiles(List<File> files) {
for (File file : files) {
if (!file.isFile() || !FileFormat.getExtension(file).equalsIgnoreCase("sfv"))
if (!FileFormat.hasExtension(file, "sfv"))
return false;
}
@ -86,7 +86,7 @@ public class FileBotUtil {
public static boolean containsOnlyListFiles(List<File> files) {
for (File file : files) {
if (!isListFile(file))
if (!FileFormat.hasExtension(file, "txt", "list", ""))
return false;
}
@ -94,19 +94,6 @@ public class FileBotUtil {
}
public static boolean isListFile(File file) {
if (!file.isFile())
return false;
String extension = FileFormat.getExtension(file).toLowerCase();
if (extension.equals("txt") || extension.equals("list") || extension.isEmpty())
return true;
return false;
}
public static void registerActionForKeystroke(JComponent component, KeyStroke keystroke, Action action) {
Integer key = action.hashCode();
component.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(keystroke, key);

View File

@ -32,9 +32,6 @@ public class FileFormat {
public static String formatName(File file) {
if (file == null)
return "";
String name = file.getName();
if (file.isDirectory())
@ -52,15 +49,27 @@ public class FileFormat {
}
public static boolean hasExtension(File file, String... extensions) {
if (!file.isFile())
return false;
String extension = getExtension(file);
for (String ext : extensions) {
if (ext.equalsIgnoreCase(extension))
return true;
}
return false;
}
public static String getExtension(File file) {
return getExtension(file, false);
}
public static String getExtension(File file, boolean includeDot) {
if (!file.isFile())
return null;
String name = file.getName();
int dotIndex = name.lastIndexOf(".");

View File

@ -30,7 +30,7 @@ import net.sourceforge.filebot.ui.transfer.TransferablePolicyImportHandler;
import net.sourceforge.filebot.ui.transfer.TransferablePolicySupport;
import net.sourceforge.filebot.ui.transferablepolicies.NullTransferablePolicy;
import net.sourceforge.filebot.ui.transferablepolicies.TransferablePolicy;
import net.sourceforge.tuned.ui.FancyListCellRenderer;
import net.sourceforge.tuned.ui.DefaultFancyListCellRenderer;
import net.sourceforge.tuned.ui.SimpleListModel;
@ -62,7 +62,7 @@ public class FileBotList extends JPanel implements Saveable, TransferablePolicyS
listScrollPane.setBorder(BorderFactory.createEmptyBorder());
}
list.setCellRenderer(new FancyListCellRenderer());
list.setCellRenderer(new DefaultFancyListCellRenderer());
list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
add(listScrollPane, BorderLayout.CENTER);

View File

@ -3,7 +3,9 @@ package net.sourceforge.filebot.ui;
import java.awt.BorderLayout;
import java.util.LinkedHashSet;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.Icon;
import javax.swing.JPanel;
@ -18,7 +20,7 @@ import net.sourceforge.filebot.ui.panel.subtitle.SubtitlePanel;
public class FileBotPanel extends JPanel {
private static final LinkedHashSet<FileBotPanel> registry = new LinkedHashSet<FileBotPanel>();
private static final List<FileBotPanel> registry = new ArrayList<FileBotPanel>();
static {
registry.add(new ListPanel());
@ -30,8 +32,8 @@ public class FileBotPanel extends JPanel {
}
public static Iterable<FileBotPanel> getAvailablePanels() {
return registry;
public static List<FileBotPanel> getAvailablePanels() {
return Collections.unmodifiableList(registry);
}

View File

@ -2,8 +2,8 @@
package net.sourceforge.filebot.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDragEvent;
@ -19,8 +19,7 @@ import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.border.EmptyBorder;
import net.sourceforge.tuned.ui.FancyListCellRenderer;
import net.sourceforge.tuned.ui.GradientStyle;
import net.sourceforge.tuned.ui.DefaultFancyListCellRenderer;
import net.sourceforge.tuned.ui.SimpleListModel;
@ -47,25 +46,27 @@ class FileBotPanelSelectionList extends JList {
}
private class PanelCellRenderer extends FancyListCellRenderer {
private class PanelCellRenderer extends DefaultFancyListCellRenderer {
public PanelCellRenderer() {
super(10, Color.decode("#163264"), GradientStyle.TOP_TO_BOTTOM);
super(BorderLayout.CENTER, 10, 0, Color.decode("#163264"));
setHighlightingEnabled(false);
setVerticalTextPosition(SwingConstants.BOTTOM);
setHorizontalTextPosition(SwingConstants.CENTER);
}
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
public void configureListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.configureListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
FileBotPanel panel = (FileBotPanel) value;
setText(panel.getPanelName());
setIcon(panel.getIcon());
return this;
}
}

View File

@ -3,7 +3,6 @@ package net.sourceforge.filebot.ui;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.ActionEvent;
@ -27,7 +26,7 @@ import javax.swing.border.EmptyBorder;
import net.sourceforge.filebot.FileBotUtil;
import net.sourceforge.filebot.resources.ResourceManager;
import net.sourceforge.tuned.ui.FancyListCellRenderer;
import net.sourceforge.tuned.ui.DefaultFancyListCellRenderer;
import net.sourceforge.tuned.ui.SimpleListModel;
@ -134,18 +133,17 @@ public class SelectDialog<T> extends JDialog {
}
private class SelectListCellRenderer extends FancyListCellRenderer {
private class SelectListCellRenderer extends DefaultFancyListCellRenderer {
public SelectListCellRenderer() {
super(4, false);
super(4);
setHighlightingEnabled(false);
}
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, convertValueToString(value), index, isSelected, cellHasFocus);
return this;
public void configureListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.configureListCellRendererComponent(list, convertValueToString(value), index, isSelected, cellHasFocus);
}
};

View File

@ -1,10 +1,10 @@
package net.sourceforge.filebot.ui.panel.rename;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.geom.Rectangle2D;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
@ -12,127 +12,54 @@ import java.util.regex.Pattern;
import javax.swing.JList;
import javax.swing.JTextField;
import javax.swing.ListCellRenderer;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Highlighter;
import javax.swing.text.JTextComponent;
import net.sourceforge.tuned.ui.GradientStyle;
import net.sourceforge.tuned.ui.AbstractFancyListCellRenderer;
public class HighlightListCellRenderer extends JTextField implements ListCellRenderer {
public class HighlightListCellRenderer extends AbstractFancyListCellRenderer {
private final JTextComponent textComponent = new JTextField();
private Pattern pattern;
private Highlighter.HighlightPainter highlightPainter;
private Color gradientBeginColor;
private Color gradientEndColor;
private GradientStyle gradientStyle;
private Insets margin;
private boolean highlightingEnabled;
private boolean selected;
private Border border;
public HighlightListCellRenderer(Pattern pattern, Highlighter.HighlightPainter highlightPainter, int padding, boolean highlighting) {
this(pattern, highlightPainter, GradientStyle.TOP_TO_BOTTOM, highlighting, new Insets(padding, padding, padding, padding), new Insets(1, 1, 0, 1), null);
}
public HighlightListCellRenderer(Pattern pattern, Highlighter.HighlightPainter highlightPainter, GradientStyle gradientStyle, boolean highlighting, Insets padding, Insets margin, Color selectedBorderColor) {
public HighlightListCellRenderer(Pattern pattern, Highlighter.HighlightPainter highlightPainter, int padding) {
super(new Insets(padding, padding, padding, padding));
this.pattern = pattern;
this.highlightPainter = highlightPainter;
this.gradientStyle = gradientStyle;
this.margin = margin;
this.highlightingEnabled = highlighting;
textComponent.setBorder(null);
textComponent.setOpaque(false);
border = new EmptyBorder(padding);
border = new CompoundBorder(new LineBorder(selectedBorderColor, 1), border);
border = new CompoundBorder(new EmptyBorder(margin), border);
this.add(textComponent, BorderLayout.WEST);
setOpaque(false);
this.getDocument().addDocumentListener(new HighlightUpdateListener());
textComponent.getDocument().addDocumentListener(new HighlightUpdateListener());
}
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
protected void configureListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.configureListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
setText(value.toString());
setSelected(isSelected);
setBorder(border);
Color sc = list.getSelectionBackground();
if (highlightingEnabled) {
Color normalBg = list.getBackground();
Color highlightBg = new Color(sc.getRed(), sc.getGreen(), sc.getBlue(), 8);
if ((index % 2) == 0)
setBackground(highlightBg);
else
setBackground(normalBg);
}
if (isSelected) {
setGradientBeginColor(sc.brighter());
setGradientEndColor(sc);
}
return this;
}
@Override
protected void paintBorder(Graphics g) {
if (selected) {
super.paintBorder(g);
}
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
Rectangle2D shape = new Rectangle2D.Double(margin.left, margin.top, getWidth() - (margin.left + margin.right), getHeight() - (margin.top + margin.bottom));
if (highlightingEnabled) {
g2d.setPaint(getBackground());
g2d.fill(shape);
}
if (selected) {
g2d.setPaint(gradientStyle.getGradientPaint(shape, gradientBeginColor, gradientEndColor));
g2d.fill(shape);
}
super.paintComponent(g);
textComponent.setText(value.toString());
}
protected void updateHighlighter() {
getHighlighter().removeAllHighlights();
textComponent.getHighlighter().removeAllHighlights();
Matcher matcher = pattern.matcher(getText());
Matcher matcher = pattern.matcher(textComponent.getText());
while (matcher.find()) {
try {
getHighlighter().addHighlight(matcher.start(0), matcher.end(0), highlightPainter);
textComponent.getHighlighter().addHighlight(matcher.start(0), matcher.end(0), highlightPainter);
} catch (BadLocationException e) {
//should not happen
Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).log(Level.SEVERE, e.toString(), e);
@ -141,38 +68,14 @@ public class HighlightListCellRenderer extends JTextField implements ListCellRen
}
public void setGradientBeginColor(Color gradientBeginColor) {
this.gradientBeginColor = gradientBeginColor;
}
public void setGradientEndColor(Color gradientEndColor) {
this.gradientEndColor = gradientEndColor;
}
public void setGradientStyle(GradientStyle gradientStyle) {
this.gradientStyle = gradientStyle;
}
public boolean isHighlightingEnabled() {
return highlightingEnabled;
}
public void setHighlightingEnabled(boolean highlightingEnabled) {
this.highlightingEnabled = highlightingEnabled;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
public boolean isSelected() {
return selected;
@Override
public void setForeground(Color fg) {
super.setForeground(fg);
// textComponent is null while in super constructor
if (textComponent != null) {
textComponent.setForeground(fg);
}
}

View File

@ -3,16 +3,15 @@ package net.sourceforge.filebot.ui.panel.rename;
import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListModel;
import net.sourceforge.tuned.ui.FancyListCellRenderer;
import net.sourceforge.tuned.ui.DefaultFancyListCellRenderer;
class RenameListCellRenderer extends FancyListCellRenderer {
class RenameListCellRenderer extends DefaultFancyListCellRenderer {
private final ListModel names;
private final ListModel files;
@ -29,24 +28,22 @@ class RenameListCellRenderer extends FancyListCellRenderer {
this.add(extension);
}
private Color noMatchGradientBeginColor = Color.decode("#B7B7B7");
private Color noMatchGradientEndColor = Color.decode("#9A9A9A");
private final Color noMatchGradientBeginColor = Color.decode("#B7B7B7");
private final Color noMatchGradientEndColor = Color.decode("#9A9A9A");
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
public void configureListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.configureListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (index >= getMinLength())
if (index >= getMinLength()) {
if (isSelected) {
setForeground(Color.WHITE);
setGradientBeginColor(noMatchGradientBeginColor);
setGradientEndColor(noMatchGradientEndColor);
setGradientColors(noMatchGradientBeginColor, noMatchGradientEndColor);
} else {
setForeground(noMatchGradientBeginColor);
}
return this;
}
}

View File

@ -5,6 +5,7 @@ package net.sourceforge.filebot.ui.panel.rename;
import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Window;
@ -52,7 +53,7 @@ public class ValidateNamesDialog extends JDialog {
JList list = new JList(new SimpleListModel(entries));
list.setEnabled(false);
list.setCellRenderer(new HighlightListCellRenderer(FileBotUtil.INVALID_CHARACTERS_PATTERN, new CharacterHighlightPainter(Color.decode("#FF4200"), Color.decode("#FF1200")), 4, true));
list.setCellRenderer(new HighlightListCellRenderer(FileBotUtil.INVALID_CHARACTERS_PATTERN, new CharacterHighlightPainter(Color.decode("#FF4200"), Color.decode("#FF1200")), 4));
JLabel label = new JLabel("Some names contain invalid characters:");
@ -84,10 +85,11 @@ public class ValidateNamesDialog extends JDialog {
setLocation(FileBotUtil.getPreferredLocation(this));
setPreferredSize(new Dimension(365, 280));
pack();
// Shortcut Escape
FileBotUtil.registerActionForKeystroke(c, KeyStroke.getKeyStroke("released ESCAPE"), cancelAction);
pack();
}

View File

@ -4,11 +4,17 @@ package net.sourceforge.filebot.ui.panel.rename.entry;
public abstract class AbstractFileEntry<T> extends ListEntry<T> {
public AbstractFileEntry(T value) {
super(value);
private final long length;
public AbstractFileEntry(String name, T value, long length) {
super(name, value);
this.length = length;
}
public abstract long getLength();
public long getLength() {
return length;
}
}

View File

@ -10,19 +10,7 @@ import net.sourceforge.filebot.FileFormat;
public class FileEntry extends AbstractFileEntry<File> {
public FileEntry(File file) {
super(file);
}
@Override
public String getName(File value) {
return FileFormat.getNameWithoutExtension(getValue());
}
@Override
public long getLength() {
return getValue().length();
super(FileFormat.formatName(file), file, file.length());
}
}

View File

@ -2,21 +2,18 @@
package net.sourceforge.filebot.ui.panel.rename.entry;
public abstract class ListEntry<T> {
public class ListEntry<T> {
private String name;
private T value;
public ListEntry(T value) {
public ListEntry(String name, T value) {
this.name = name;
this.value = value;
this.name = getName(value);
}
protected abstract String getName(T value);
public String getName() {
return name;
}

View File

@ -5,12 +5,7 @@ package net.sourceforge.filebot.ui.panel.rename.entry;
public class StringEntry extends ListEntry<String> {
public StringEntry(String string) {
super(string);
super(string, string);
}
@Override
protected String getName(String value) {
return value;
}
}

View File

@ -10,19 +10,7 @@ import net.sourceforge.filebot.torrent.Torrent.Entry;
public class TorrentEntry extends AbstractFileEntry<Torrent.Entry> {
public TorrentEntry(Entry value) {
super(value);
}
@Override
public String getName(Torrent.Entry value) {
return FileFormat.getNameWithoutExtension(getValue().getName());
}
@Override
public long getLength() {
return getValue().getLength();
super(FileFormat.getNameWithoutExtension(value.getName()), value, value.getLength());
}
}

View File

@ -4,6 +4,7 @@ package net.sourceforge.filebot.ui.panel.subtitle;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -20,12 +21,12 @@ public class Language {
public static List<Language> languages = null;
public static synchronized Iterable<Language> getLanguages() {
public static synchronized List<Language> getLanguages() {
if (languages == null) {
languages = parseLanguages();
}
return languages;
return Collections.unmodifiableList(languages);
}
@ -52,7 +53,7 @@ public class Language {
private static List<Language> parseLanguages() {
ArrayList<Language> languages = new ArrayList<Language>();
List<Language> languages = new ArrayList<Language>();
try {
Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(Language.class.getResourceAsStream("languages.xml"));

View File

@ -5,9 +5,12 @@ package net.sourceforge.filebot.ui.transfer;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.Transferable;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.TransferHandler;
import net.sourceforge.filebot.resources.ResourceManager;
public class DefaultTransferHandler extends TransferHandler {

View File

@ -7,8 +7,5 @@ import net.sourceforge.filebot.ui.transferablepolicies.TransferablePolicy;
public interface TransferablePolicySupport {
public void setTransferablePolicy(TransferablePolicy transferablePolicy);
public TransferablePolicy getTransferablePolicy();
}

View File

@ -3,7 +3,8 @@ package net.sourceforge.filebot.web;
import java.net.URL;
import java.util.LinkedHashSet;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.ImageIcon;
@ -11,7 +12,7 @@ import javax.swing.ImageIcon;
public abstract class EpisodeListClient {
private static final LinkedHashSet<EpisodeListClient> registry = new LinkedHashSet<EpisodeListClient>();
private static final List<EpisodeListClient> registry = new ArrayList<EpisodeListClient>();
static {
registry.add(new TvdotcomClient());
@ -20,8 +21,8 @@ public abstract class EpisodeListClient {
}
public static Iterable<EpisodeListClient> getAvailableEpisodeListClients() {
return registry;
public static List<EpisodeListClient> getAvailableEpisodeListClients() {
return Collections.unmodifiableList(registry);
}

View File

@ -32,7 +32,7 @@ public class TemporaryFolder {
* Delete all temporary folders on shutdown
*/
static {
Runtime.getRuntime().addShutdownHook(new Thread("TemporaryFolder ShutdownHook") {
Runtime.getRuntime().addShutdownHook(new Thread("TemporaryFolder Cleanup") {
@Override
public void run() {

View File

@ -0,0 +1,313 @@
package net.sourceforge.tuned.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.geom.Rectangle2D;
import javax.swing.JComponent;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
public abstract class AbstractFancyListCellRenderer extends JComponent implements ListCellRenderer {
private Color gradientBeginColor;
private Color gradientEndColor;
private Color highlightColor;
private boolean borderPainted = false;
private boolean gradientPainted = false;
private GradientStyle gradientStyle = GradientStyle.TOP_TO_BOTTOM;
private boolean highlightingEnabled = true;
private final Insets margin;
private static final Insets DEFAULT_PADDING = new Insets(7, 7, 7, 7);
private static final Insets DEFAULT_MARGIN = new Insets(1, 1, 0, 1);
public AbstractFancyListCellRenderer() {
this(DEFAULT_PADDING, DEFAULT_MARGIN, null);
}
public AbstractFancyListCellRenderer(Insets padding) {
this(padding, DEFAULT_MARGIN, null);
}
public AbstractFancyListCellRenderer(Insets padding, Insets margin) {
this(padding, margin, null);
}
public AbstractFancyListCellRenderer(Insets padding, Insets margin, Color borderColor) {
this.setLayout(new BorderLayout());
this.margin = margin;
Border border = null;
if (padding != null)
border = new EmptyBorder(padding);
if (borderColor != null)
border = new CompoundBorder(new LineBorder(borderColor, 1), border);
if (margin != null)
border = new CompoundBorder(new EmptyBorder(margin), border);
setBorder(border);
setOpaque(false);
}
@Override
protected void paintBorder(Graphics g) {
if (borderPainted) {
super.paintBorder(g);
}
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
Rectangle2D shape = new Rectangle2D.Double(margin.left, margin.top, getWidth() - (margin.left + margin.right), getHeight() - (margin.top + margin.bottom));
if (isOpaque()) {
g2d.setPaint(getBackground());
g2d.fill(shape);
}
if (highlightingEnabled && (highlightColor != null)) {
g2d.setPaint(highlightColor);
g2d.fill(shape);
}
if (gradientPainted) {
g2d.setPaint(gradientStyle.getGradientPaint(shape, gradientBeginColor, gradientEndColor));
g2d.fill(shape);
}
super.paintComponent(g);
}
@Override
public final Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
configureListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
validate();
return this;
}
protected void configureListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
setBackground(list.getBackground());
setGradientPainted(isSelected);
setBorderPainted(isSelected);
Color sc = list.getSelectionBackground();
if (isSelected) {
setGradientColors(sc.brighter(), sc);
}
if (highlightingEnabled && ((index % 2) == 0)) {
setHighlightColor(new Color(sc.getRed(), sc.getGreen(), sc.getBlue(), 28));
} else {
setHighlightColor(null);
}
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
}
public void setGradientColors(Color gradientBeginColor, Color gradientEndColor) {
this.gradientBeginColor = gradientBeginColor;
this.gradientEndColor = gradientEndColor;
}
public Color getGradientBeginColor() {
return gradientBeginColor;
}
public Color getGradientEndColor() {
return gradientEndColor;
}
public void setHighlightColor(Color highlightColor) {
this.highlightColor = highlightColor;
}
public void setGradientStyle(GradientStyle gradientStyle) {
this.gradientStyle = gradientStyle;
}
public void setHighlightingEnabled(boolean highlightingEnabled) {
this.highlightingEnabled = highlightingEnabled;
}
public void setBorderPainted(boolean borderPainted) {
this.borderPainted = borderPainted;
}
public void setGradientPainted(boolean gradientPainted) {
this.gradientPainted = gradientPainted;
}
public Color getHighlightColor() {
return highlightColor;
}
public boolean isBorderPainted() {
return borderPainted;
}
public GradientStyle getGradientStyle() {
return gradientStyle;
}
public boolean isHighlightingEnabled() {
return highlightingEnabled;
}
@Override
public void validate() {
// validate children, yet avoid flickering of the mouse cursor
validateTree();
}
/**
* Overridden for performance reasons.
*/
@Override
public void repaint() {
}
/**
* Overridden for performance reasons.
*/
@Override
public void repaint(long tm, int x, int y, int width, int height) {
}
/**
* Overridden for performance reasons.
*/
@Override
public void repaint(Rectangle r) {
}
/**
* Overridden for performance reasons.
*/
@Override
protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
}
/**
* Overridden for performance reasons.
*/
@Override
public void firePropertyChange(String propertyName, byte oldValue, byte newValue) {
}
/**
* Overridden for performance reasons.
*/
@Override
public void firePropertyChange(String propertyName, char oldValue, char newValue) {
}
/**
* Overridden for performance reasons.
*/
@Override
public void firePropertyChange(String propertyName, short oldValue, short newValue) {
}
/**
* Overridden for performance reasons.
*/
@Override
public void firePropertyChange(String propertyName, int oldValue, int newValue) {
}
/**
* Overridden for performance reasons.
*/
@Override
public void firePropertyChange(String propertyName, long oldValue, long newValue) {
}
/**
* Overridden for performance reasons.
*/
@Override
public void firePropertyChange(String propertyName, float oldValue, float newValue) {
}
/**
* Overridden for performance reasons.
*/
@Override
public void firePropertyChange(String propertyName, double oldValue, double newValue) {
}
/**
* Overridden for performance reasons.
*/
@Override
public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {
}
}

View File

@ -0,0 +1,81 @@
package net.sourceforge.tuned.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Insets;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JList;
public class DefaultFancyListCellRenderer extends AbstractFancyListCellRenderer {
private final JLabel label = new JLabel();
public DefaultFancyListCellRenderer() {
this.add(label, BorderLayout.WEST);
initializeLabel(BorderLayout.WEST);
}
public DefaultFancyListCellRenderer(int padding) {
super(new Insets(padding, padding, padding, padding));
initializeLabel(BorderLayout.WEST);
}
protected DefaultFancyListCellRenderer(Object constraint, int padding, int margin, Color selectedBorderColor) {
super(new Insets(padding, padding, padding, padding), new Insets(margin, margin, margin, margin), selectedBorderColor);
initializeLabel(constraint);
}
private void initializeLabel(Object constraint) {
label.setOpaque(false);
add(label, constraint);
}
@Override
protected void configureListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.configureListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
setText(value.toString());
}
public void setIcon(Icon icon) {
label.setIcon(icon);
}
public void setText(String text) {
label.setText(text);
}
public void setHorizontalTextPosition(int textPosition) {
label.setHorizontalTextPosition(textPosition);
}
public void setVerticalTextPosition(int textPosition) {
label.setVerticalTextPosition(textPosition);
}
@Override
public void setForeground(Color fg) {
super.setForeground(fg);
// label is null while in super constructor
if (label != null) {
label.setForeground(fg);
}
}
}

View File

@ -1,147 +0,0 @@
package net.sourceforge.tuned.ui;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.geom.Rectangle2D;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
public class FancyListCellRenderer extends DefaultListCellRenderer {
private Color gradientBeginColor;
private Color gradientEndColor;
private GradientStyle gradientStyle;
private Insets margin;
private boolean highlightingEnabled;
private boolean selected;
private Border border;
public FancyListCellRenderer() {
this(GradientStyle.TOP_TO_BOTTOM, true, new Insets(7, 7, 7, 7), new Insets(1, 1, 0, 1), null);
}
public FancyListCellRenderer(int padding, boolean highlighting) {
this(GradientStyle.TOP_TO_BOTTOM, highlighting, new Insets(padding, padding, padding, padding), new Insets(1, 1, 0, 1), null);
}
public FancyListCellRenderer(int padding, Color selectedBorderColor, GradientStyle gradientStyle) {
this(gradientStyle, false, new Insets(padding, padding, padding, padding), new Insets(0, 0, 0, 0), selectedBorderColor);
}
public FancyListCellRenderer(GradientStyle gradientStyle, boolean highlighting, Insets padding, Insets margin, Color selectedBorderColor) {
this.gradientStyle = gradientStyle;
this.margin = margin;
this.highlightingEnabled = highlighting;
border = new EmptyBorder(padding);
border = new CompoundBorder(new LineBorder(selectedBorderColor, 1), border);
border = new CompoundBorder(new EmptyBorder(margin), border);
setOpaque(false);
}
@Override
protected void paintBorder(Graphics g) {
if (selected) {
super.paintBorder(g);
}
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
Rectangle2D shape = new Rectangle2D.Double(margin.left, margin.top, getWidth() - (margin.left + margin.right), getHeight() - (margin.top + margin.bottom));
if (highlightingEnabled) {
g2d.setPaint(getBackground());
g2d.fill(shape);
}
if (selected) {
g2d.setPaint(gradientStyle.getGradientPaint(shape, gradientBeginColor, gradientEndColor));
g2d.fill(shape);
}
super.paintComponent(g);
}
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
setSelected(isSelected);
setBorder(border);
Color sc = list.getSelectionBackground();
if (highlightingEnabled) {
Color normalBg = list.getBackground();
Color highlightBg = new Color(sc.getRed(), sc.getGreen(), sc.getBlue(), 28);
if ((index % 2) == 0)
setBackground(highlightBg);
else
setBackground(normalBg);
}
if (isSelected) {
setGradientBeginColor(sc.brighter());
setGradientEndColor(sc);
}
return this;
}
public void setGradientBeginColor(Color gradientBeginColor) {
this.gradientBeginColor = gradientBeginColor;
}
public void setGradientEndColor(Color gradientEndColor) {
this.gradientEndColor = gradientEndColor;
}
public void setGradientStyle(GradientStyle gradientStyle) {
this.gradientStyle = gradientStyle;
}
public boolean isHighlightingEnabled() {
return highlightingEnabled;
}
public void setHighlightingEnabled(boolean highlightingEnabled) {
this.highlightingEnabled = highlightingEnabled;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
public boolean isSelected() {
return selected;
}
}

View File

@ -112,7 +112,7 @@ public class SimpleListModel extends AbstractListModel {
Collections.sort(list, null);
}
fireContentsChanged(this, 0, list.size());
fireContentsChanged(this, 0, list.size() - 1);
}