/*
* Copyright (C) 2015 たんらる
*/
package fourthline.mabiicco.ui.color;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import javax.swing.JColorChooser;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.colorchooser.ColorSelectionModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public final class ColorPicker implements ColorSelectionModel {
private final JColorChooser chooser;
private final PreviewPane pane;
private final ArrayList<ChangeListener> listener = new ArrayList<>();
private ColorPicker() {
pane = new PreviewPane(this);
chooser = new JColorChooser(this);
}
private void show() {
chooser.setPreviewPanel(pane);
setSelectedTrackColor();
JOptionPane.showConfirmDialog(null,
chooser,
"Color",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE);
}
private void setSelectedTrackColor() {
listener.forEach(e -> e.stateChanged(new ChangeEvent(this)));
pane.repaint();
}
@Override
public Color getSelectedColor() {
return pane.getSelectedTrackBaseColor().getBaseColor();
}
@Override
public void setSelectedColor(Color color) {
pane.getSelectedTrackBaseColor().setColor(color);
setSelectedTrackColor();
}
@Override
public void addChangeListener(ChangeListener listener) {
this.listener.add(listener);
}
@Override
public void removeChangeListener(ChangeListener listener) {
this.listener.remove(listener);
}
static class PreviewPane extends JPanel implements MouseListener {
private static final long serialVersionUID = -8305524044560054314L;
private final int WIDTH = 32;
private final int HEIGHT = 14;
private int selectedIndex = 0;
private ColorPicker parent;
public PreviewPane(ColorPicker parent) {
this.parent = parent;
setPreferredSize(new Dimension(WIDTH*ColorPalette.getInstanceSize(), HEIGHT*6));
addMouseListener(this);
}
public ColorPalette getSelectedTrackBaseColor() {
return ColorPalette.getInstance(selectedIndex);
}
private void drawRect(Graphics g, Color rectColor, Color fillColor, int track, int part) {
int x = track * WIDTH;
int y = (part+1) * HEIGHT;
g.setColor(fillColor);
g.fillRect(x, y, WIDTH-2, HEIGHT-2);
g.setColor(rectColor);
g.drawRect(x, y, WIDTH-3, HEIGHT-3);
}
private void drawSample(Graphics g) {
for (int i = 0; i < ColorPalette.getInstanceSize(); i++) {
ColorPalette colorPalette = ColorPalette.getInstance(i);
{
Color fillColor = colorPalette.getActiveFillColor();
Color rectColor = colorPalette.getActiveRectColor();
drawRect(g, rectColor, fillColor, i, 0);
}
for (int partIndex = 0; partIndex < 4; partIndex++) {
Color fillColor = colorPalette.getPartFillColor(partIndex);
Color rectColor = colorPalette.getPartRectColor(partIndex);
drawRect(g, rectColor, fillColor, i, partIndex+1);
}
}
}
private void drawMarker(Graphics g) {
g.setColor(Color.BLACK);
g.drawArc(selectedIndex*WIDTH+WIDTH/2-6, 0, 10, 10, 0, 360);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
drawMarker(g);
drawSample(g);
}
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {
int x = e.getPoint().x;
selectedIndex = x / WIDTH;
parent.setSelectedTrackColor();
}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
}
public static void main(String args[]) {
ColorPicker colorPicker = new ColorPicker();
colorPicker.show();
}
}