package org.freehep.swing; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.util.Vector; import javax.swing.DefaultListCellRenderer; import javax.swing.Icon; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.ListSelectionModel; import javax.swing.colorchooser.AbstractColorChooserPanel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; public class ColorNameChooserPanel extends AbstractColorChooserPanel implements ListSelectionListener { private JList list; public ColorNameChooserPanel() { } // AbstractColorChooserPanel methods protected void buildChooser() { String[] names = ColorConverter.getNames(); Vector labels = new Vector(names.length); for (int i=0; i<names.length; i++) { try { Color c = ColorConverter.get(names[i]); IconLabel cl = new IconLabel(names[i], c); labels.add(cl); } catch (ColorConverter.ColorConversionException e) { e.printStackTrace(); } } list = new JList(labels); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list.setSelectedIndex(-1); list.setCellRenderer(new ColorListCellRenderer()); list.addListSelectionListener(this); JScrollPane scrollPane = new JScrollPane(list); add(scrollPane); } public void updateChooser() { //System.out.println("ColorNameChooserPanel.updateChooser :: Color: " + getColorSelectionModel().getSelectedColor()); } public String getDisplayName() { return "By Name"; } public Icon getSmallDisplayIcon() { return null; } public Icon getLargeDisplayIcon() { return null; } // ListSelectionListener methods public void valueChanged(ListSelectionEvent e) { Color color = null; int index = list.getSelectedIndex(); if (index >= 0) { color = ((IconLabel) list.getSelectedValue()).getColor(); } getColorSelectionModel().setSelectedColor(color); } // inner classes private class ColorListCellRenderer extends DefaultListCellRenderer { ColorListCellRenderer() { super(); } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (value instanceof IconLabel) { Icon icon = ((IconLabel) value).getIcon(); this.setIcon(icon); } return c; } } private class IconLabel { private Color color; private String name; private ColorIcon icon; IconLabel(String name, Color color) { this.name = name; this.color = color; icon = new ColorIcon(color); } public Color getColor() { return color; } public Icon getIcon() { return icon; } public String toString() { return name; } } private class ColorIcon implements Icon { private Color color; private int sizeX = 16; private int sizeY = 10; ColorIcon(Color color) { this.color = color; } public void setIconHeight(int size) { sizeY = size; } public void setIconWidth(int size) { sizeX = size; } public int getIconHeight() { return sizeY; } public int getIconWidth() { return sizeX; } public void paintIcon(Component p1, Graphics g, int x, int y) { Color save = g.getColor(); g.setColor((color == null) ? getBackground() : color); g.fill3DRect(x, y, sizeX, sizeY, true); g.setColor(save); } } }