package open.dolphin.client; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.geom.Ellipse2D; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import javax.swing.JComponent; /** * ColorChooserLabel * * @author Minagawa,Kazushi */ public class ColorChooserComp extends JComponent implements MouseListener, MouseMotionListener { public static final String SELECTED_COLOR = "selectedColor"; private final Color[] colors; private Color[] colorStart; private final Dimension size; private final Color strokeColor = Color.DARK_GRAY; private int strokeWidth = 2; private final PropertyChangeSupport boundSupport = new PropertyChangeSupport(this); private Color selected; private int index = -1; /** * Creates a new progress panel with default values */ public ColorChooserComp() { colorStart = ClientContext.getColorArray("color.set.default.start"); colors = ClientContext.getColorArray("color.set.default.end"); size = new Dimension(10,10); strokeWidth = 1; this.setPreferredSize(new Dimension(2*size.width*colors.length + size.width, 2*size.height)); this.addMouseListener(ColorChooserComp.this); this.addMouseMotionListener(ColorChooserComp.this); this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); } /** * Creates a new progress panel with default values * @param size * @param colors */ public ColorChooserComp(Dimension size, Color[] colors) { this.size = size; this.colors = colors; this.setPreferredSize(new Dimension(2*size.width*colors.length + size.width, 2*size.height)); this.addMouseListener(ColorChooserComp.this); this.addMouseMotionListener(ColorChooserComp.this); this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); } @Override public void addPropertyChangeListener(String prop, PropertyChangeListener l) { boundSupport.addPropertyChangeListener(prop, l); } @Override public void removePropertyChangeListener(String prop, PropertyChangeListener l) { boundSupport.removePropertyChangeListener(prop, l); } public Color getSelectedColor() { return selected; } public void setSelectedColor(Color selected) { this.selected = selected; boundSupport.firePropertyChange(SELECTED_COLOR, null, this.selected); } @Override public void mouseDragged(MouseEvent e) { } @Override public void mouseMoved(MouseEvent e) { int x = e.getX() / size.width; int mod = x % 2; if (mod != 0) { index = x / 2; } repaint(); } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { int x = e.getX() / size.width; int mod = x % 2; if (mod != 0) { index = x / 2; } repaint(); } @Override public void mouseExited(MouseEvent e) { index = -1; repaint(); } @Override public void mouseClicked(MouseEvent e) { int x = e.getX() / size.width; int mod = x % 2; if (mod != 0) { index = x / 2; } if (index >= 0 && index < colors.length) { setSelectedColor(colors[index]); } } @Override public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; double dx = size.getWidth()*2; double offsetX = size.getWidth(); double offsetY = (this.getPreferredSize().getHeight() - size.getHeight())/2; BasicStroke stroke = new BasicStroke(strokeWidth); RenderingHints rh = new RenderingHints( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHints(rh); for (int i=0; i < colors.length; i++) { double x = offsetX + i * dx; double y = offsetY; Ellipse2D.Double body = new Ellipse2D.Double(x, y, size.getWidth(), size.getHeight()); GradientPaint lightToDark = new GradientPaint((int)x, (int)y, colorStart[i], (int)x + size.width, (int)y + size.height, colors[i]); g2.setPaint(lightToDark); g2.fill(body); if (i == index) { g2.setColor(strokeColor); g2.setStroke(stroke); g2.draw(body); } } } }