package jas.util; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.util.Enumeration; import java.util.Vector; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JOptionPane; import javax.swing.colorchooser.AbstractColorChooserPanel; /** * A button which allows the user to select a color. */ public class ColorChooser extends JButton { public ColorChooser() { this(Color.black); } public ColorChooser(Color c) { m_color = c; setIcon(new ColorChooserIcon()); } public ColorChooser(final String key) { this(); m_prop = Application.getApplication().getUserProperties(); m_key = key; setColor(m_prop.getColor(key, Color.black)); } public void setColor(Color c) { m_color = c; repaint(); // Should not be necessary? (swing 0.6.1) Enumeration e = m_listeners.elements(); while (e.hasMoreElements()) { ColorListener l = (ColorListener) e.nextElement(); l.colorChanged(new ColorEvent(this,c)); } } public Color getColor() { return m_color; } public void addColorListener(ColorListener l) { m_listeners.addElement(l); } public void removeColorListener(ColorListener l) { m_listeners.removeElement(l); } protected void fireActionPerformed(ActionEvent e) { JColorChooser chooser = new JColorChooser(m_color); chooser.addChooserPanel(new ARGBColorChooserPanel()); if (m_color.getAlpha() != 255) { AbstractColorChooserPanel[] panels = chooser.getChooserPanels(); int l = panels.length; AbstractColorChooserPanel[] newpanels = new AbstractColorChooserPanel[l]; for (int i=1; i<l; i++) newpanels[i] = panels[i-1]; newpanels[0] = panels[l-1]; chooser.setChooserPanels(newpanels); } int rc = JOptionPane.showOptionDialog(this,chooser,"Choose color...",JOptionPane.OK_CANCEL_OPTION,JOptionPane.PLAIN_MESSAGE,null,null,null); if (rc == JOptionPane.OK_OPTION) { Color c = chooser.getColor(); setColor(c); if (m_key != null) m_prop.setColor(m_key, c); } } private UserProperties m_prop; private String m_key; private Color m_color; private Vector m_listeners = new Vector(); public Dimension getPreferredSize() { return new Dimension(20,20); } private class ColorChooserIcon implements Icon { public int getIconHeight() { return 16; } public int getIconWidth() { return 16; } public void paintIcon(Component component, Graphics g, int x, int y) { g.setColor(m_color); g.fillRect(x,y,16,16); } } }