/*
* @(#)PaletteEntryCellRenderer.java 1.0 19 septembre 2005
*
* Copyright (c) 2005-2010 Werner Randelshofer, Immensee, Switzerland.
* All rights reserved.
*
* You may not use, copy or modify this file, except in compliance with the
* license agreement you entered into with Werner Randelshofer.
* For details see accompanying license terms.
*/
package ch.randelshofer.quaqua.colorchooser;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
/**
* PaletteEntryCellRenderer.
*
* @author Werner Randelshofer
* @version 1.0 19 septembre 2005 Created.
*/
public class PaletteEntryCellRenderer extends DefaultListCellRenderer {
/** The following colors are used to draw the marker that marks the
* closest color in the palette.
* The "closest color" is used, when the palette does not contain an
* exact match to the currently selected color in the color chooser.
* The marker is used to help the user finding the closest color in the
* palette.
*/
private Color closestMarker1 = new Color(0xe6e6e6);
private Color closestMarker2 = new Color(0xededed);
private Color closestMarker3 = new Color(0xf0f0f0);
static class ColorIcon implements Icon {
private Color color = Color.black;
public void setColor(Color c) {
this.color = c;
}
public Color getColor() {
return color;
}
public int getIconHeight() {
return 15;
}
public int getIconWidth() {
return 25;
}
public void paintIcon(Component c, Graphics g, int x, int y) {
g.setColor(getColor());
g.fillRect(x + 1, y + 1, getIconWidth() - 2, getIconHeight() - 2);
g.setColor(getColor().darker());
g.drawRect(x, y, getIconWidth() - 1, getIconHeight() - 1);
}
}
private ColorIcon icon;
private boolean isClosestColor;
/**
* Creates a new instance.
*/
public PaletteEntryCellRenderer() {
icon = new ColorIcon();
setIcon(icon);
setOpaque(false);
}
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
setComponentOrientation(list.getComponentOrientation());
if (isSelected) {
setBackground(UIManager.getColor("ColorChooser.listSelectionBackground"));
setForeground(UIManager.getColor("ColorChooser.listSelectionForeground"));
isClosestColor = false;
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
PaletteListModel model = (PaletteListModel) list.getModel();
isClosestColor = model.getClosestIndex() == index;
}
setEnabled(list.isEnabled());
setFont(list.getFont());
//setBorder((cellHasFocus) ? UIManager.getBorder("List.focusCellHighlightBorder") : noFocusBorder);
PaletteEntry entry = (PaletteEntry) value;
icon.setColor(entry.getColor());
setText(entry.getName());
return this;
}
public void paintComponent(Graphics g) {
int width = getWidth();
int height = getHeight();
g.setColor(getBackground());
g.fillRect(0,0,width,height);
if (isClosestColor) {
g.setColor(closestMarker1);
g.fillRect(0,0,width,2);
g.fillRect(0,height - 2,width,2);
g.setColor(closestMarker2);
g.fillRect(0,2,width,1);
g.fillRect(0,height - 3,width,1);
g.setColor(closestMarker3);
g.fillRect(0,3,width,1);
g.fillRect(0,height - 4,width,1);
}
super.paintComponent(g);
}
}