/*
* Copyright (c) 2014 tabletoptool.com team.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* rptools.com team - initial implementation
* tabletoptool.com team - further development
*/
package com.t3.swing;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Paint;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JToggleButton;
import javax.swing.SpinnerNumberModel;
import javax.swing.border.BevelBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import com.jeta.forms.components.panel.FormPanel;
import com.jeta.forms.gui.form.FormAccessor;
public class ColorPicker extends JPanel {
private Component owner;
private PaintedPanel foregroundColor;
private PaintedPanel backgroundColor;
private List<PaintedPanel> recentColors = new ArrayList<PaintedPanel>(16);
private JToggleButton snapToggle;
private JToggleButton eraseToggle;
private PaintChooser paintChooser;
private JSpinner penWidthSpinner;
private JSpinner transparencySpinner;
private static final int RECENT_COLOR_LIST_SIZE = 16;
private static final int maxPenWidth = 300;
private static final Color[] DEFAULT_COLORS = new Color[] { null, Color.black, Color.darkGray, Color.lightGray, Color.white, Color.pink,
new Color(127, 0, 0), Color.red, Color.orange, Color.yellow, new Color(0, 127, 0), Color.green, Color.blue, Color.cyan,
new Color(127, 0, 127), Color.magenta, new Color(127 + 32, 127, 61), };
public ColorPicker(Component owner) {
this.owner = owner;
paintChooser = new PaintChooser();
paintChooser.setPreferredSize(new Dimension(450, 400));
FormPanel panel = new FormPanel("com/t3/swing/forms/colorPanel.xml");
ColorWellListener listener = new ColorWellListener(1);
foregroundColor = new PaintedPanel();
backgroundColor = new PaintedPanel();
JPanel wrappedForeground = new JPanel(new GridLayout());
wrappedForeground.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
wrappedForeground.add(foregroundColor);
foregroundColor.addMouseListener(listener);
JPanel wrappedBackground = new JPanel(new GridLayout());
wrappedBackground.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
wrappedBackground.add(backgroundColor);
backgroundColor.addMouseListener(listener);
FormAccessor accessor = panel.getFormAccessor( "colorPanel" );
accessor.replaceBean("foregroundColor", wrappedForeground);
accessor.replaceBean("backgroundColor", wrappedBackground);
listener = new ColorWellListener(2);
accessor = panel.getFormAccessor("recentColors");
for (int i = 0; i < RECENT_COLOR_LIST_SIZE; i++) {
PaintedPanel paintedPanel = new PaintedPanel();
paintedPanel.setPreferredSize(new Dimension(15, 15));
JPanel wrappedPanel = new JPanel(new GridLayout());
wrappedPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
wrappedPanel.add(paintedPanel);
accessor.replaceBean("recentColor" + i, wrappedPanel);
paintedPanel.addMouseListener(listener);
recentColors.add(paintedPanel);
}
snapToggle = (JToggleButton) panel.getButton("toggleSnapToGrid");
eraseToggle = (JToggleButton) panel.getButton("toggleErase");
penWidthSpinner = panel.getSpinner("penWidth");
penWidthSpinner.setModel(new SpinnerNumberModel(3, 1, maxPenWidth, 1));
penWidthSpinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
try {
penWidthSpinner.commitEdit();
} catch (ParseException pe) {
pe.printStackTrace();
}
}
});
transparencySpinner = panel.getSpinner("opacity");
transparencySpinner.setModel(new SpinnerNumberModel(100, 1, 100, 1));
transparencySpinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
try {
transparencySpinner.commitEdit();
} catch (ParseException pe) {
pe.printStackTrace();
}
}
});
initialize();
add(panel);
}
public PaintChooser getPaintChooser() {
return paintChooser;
}
public void initialize() {
foregroundColor.setPaint(Color.BLACK);
backgroundColor.setPaint(Color.WHITE);
for (int i = 0; i < DEFAULT_COLORS.length && i < RECENT_COLOR_LIST_SIZE; i++) {
recentColors.get(i).setPaint(DEFAULT_COLORS[i]);
}
}
public void setForegroundPaint(Paint paint) {
foregroundColor.setPaint(paint);
}
public void setBackgroundPaint(Paint paint) {
backgroundColor.setPaint(paint);
}
public boolean isFillForegroundSelected() {
return foregroundColor.getPaint() != null;
}
public boolean isFillBackgroundSelected() {
return backgroundColor.getPaint() != null;
}
public void setEraseSelected(boolean selected) {
eraseToggle.setSelected(selected);
}
public boolean isEraseSelected() {
return eraseToggle.isSelected();
}
public void setSnapSelected(boolean selected) {
snapToggle.setSelected(selected);
}
public boolean isSnapSelected() {
return snapToggle.isSelected();
}
public void setTranslucency(int percent) {
percent = Math.max(0, percent);
percent = Math.min(100, percent);
transparencySpinner.setValue(percent);
}
public void setPenWidth(int width) {
width = Math.max(0, width);
width = Math.min(maxPenWidth, width);
penWidthSpinner.setValue(width);
}
public Paint getForegroundPaint() {
return foregroundColor.getPaint();
}
public Paint getBackgroundPaint() {
return backgroundColor.getPaint();
}
public int getStrokeWidth() {
return (Integer)penWidthSpinner.getValue();
}
public float getOpacity() {
return ((Integer)transparencySpinner.getValue()) / 100.0f;
}
public class ColorWellListener extends MouseAdapter {
private int clickCount;
public ColorWellListener(int clickCount) {
this.clickCount = clickCount;
}
@Override
public void mouseClicked(MouseEvent evt) {
PaintedPanel comp = (PaintedPanel) evt.getSource();
if (evt.getClickCount() == clickCount) {
Paint result = paintChooser.choosePaint((JFrame)owner, comp.getPaint()); // TODO: This is a bad cast, be more smart about it
comp.setPaint(result);
return;
}
switch (evt.getButton()) {
case MouseEvent.BUTTON1:
foregroundColor.setPaint(comp.getPaint());
break;
case MouseEvent.BUTTON3:
backgroundColor.setPaint(comp.getPaint());
break;
}
}
}
}